El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

PowerShell: Cmdlet para listar las conexiones de red de un equipo

Posted by urpiano en Jueves 19 \19\UTC enero \19\UTC 2012

Esta función tiene como devolución los objetos de la clase WMI Win32_NetworkAdapter, agregándole propiedades de la clase WMI Win32_NetworkAdapterConfiguration, lo que permite obtener resultados parecidos (aunque mucho más amplios) al comando IPCONFIG, ya que la información suministrada por este comando junta la información de ambas clases (como si de un Join de SQL se tratara, pues cada instancia de una de ambas clases tiene su correspondiente en la otra) obteniendo así la información de las conexiones de red.

La función permite recibir el nombre de equipo a enumerar por canalización, así como suministrar credenciales alternativas, permitiendo obtener los resultados de múltiples equipos con una única ejecución.

Para su funcionamiento requiere la función Invoke-WmiExpression, incluída en el código que acompaña a esta entrada.

El Cmdlet incluye ayuda, pego a continuación la ayuda con modificador -Detailed (esta ayuda se basa en la prestación de ayuda basada en comentarios de PowerShell 2.0 ¿Qué todavía tienes la versión 1.0 y no la 2.0? ¿A qué esperas para instalarla si es mucho mejor?):

NOMBRE
    Get-NetworkConnection

SINOPSIS
    Enumera las conexiones de red de un equipo.

SINTAXIS
    Get-NetworkConnection [[-ComputerName] <String>] [[-Credential] <Object>] [[-AdapterType] <String>] [[-PhysicalOnly]] [[-IpOnly]] [<CommonParamet
    ers>]

DESCRIPCIÓN
    Esta función tiene como devolución los objetos de la clase WMI
    Win32_NetworkAdapter, agregándole propiedades de la clase WMI
    Win32_NetworkAdapterConfiguration, lo que permite obtener resultados
    parecidos (aunque mucho más amplios) al comando IPCONFIG, ya que la
    información suministrada por este comando junta la información de ambas
    clases (como si de un Join de SQL se tratara, pues cada instancia de
    una de ambas clases tiene su correspondiente en la otra) obteniendo así
    la información de las conexiones de red.

    La función permite recibir el nombre de equipo a enumerar por canalización,
    así como suministrar credenciales alternativas, permitiendo obtener los
    resultados de múltiples equipos cun una única ejecución.

PARÁMETROS
    -ComputerName <String>
      Nombre o IP del equipo al que se consultará. Tiene también los alias
      "Equipo","Sistema","E","C" y "S". Si se omite este parámetro, se obtienen
      las conexiones de red del equipo local.

    -Credential <Object>
      Nombre de usuario o credenciales completas del usuario con el que se
      conectara a WMI. En caso de pasarse sólo el nombre de usuario, se pedirá
      entrar la contraseña del mismo. Si se pasan credenciales y se consulta el
      equipo local, las credenciales serán ignoradas, pues no se puede conectar
      a WMI del equipo local con credenciales alternativas. Tiene también los
      alias "Usuario","U","Credenciales" y "Cred". Si se omite este parámetro
      la consulta a WMI la realiza el usuario que lanza la función.

    -AdapterType <String>
      Este parámetro permite especificar el tipo de adaptador de red que será
      devuelto. Los posibles tipos son (el tipo "estrella" es "Ethernet 802.3",
      que es el tipo de las NICs):
        - "Ethernet 802.3"
        - "Token Ring 802.5"
        - "Fiber Distributed Data Interface (FDDI)"
        - "Wide Area Network (WAN)"
        - "LocalTalk"
        - "Ethernet using DIX header format"
        - "ARCNET"
        - "ARCNET (878.2)"
        - "ATM"
        - "Wireless"
        - "Infrared Wireless"
        - "Bpc"
        - "CoWan"
        - "1394"
      Este parámetro tiene los alias "TipoAdaptador", "Tipo", "TA" y "T". Si se
      omite este parámetro se enumeran todos los tipos de adaptador.

    -PhysicalOnly [<SwitchParameter>]
      Si se pasa este modificador, sólo las conexiones de red físicas serán
      devueltas, si no se pasa se devuelven tanto las físicas como las lógicas.
      Esta es una propiedad de la clase Win32_NetworkAdapter (PhysicalAdapter).
      Este modificador tiene los alias "Physical", "Fisico", "P" y "F".

    -IpOnly [<SwitchParameter>]
      Si se pasa este modificador, sólo las conexiones cuya configuración esté
      habilitada para IP serán devueltas. Esta es una propiedad de la clase
      Win32_NetworkAdapterConfiguration (IpEnabled). Este modificador tiene el
      alias "IP". Si se omite este parámetro, se obtienen tanto las que están
      habilitadas para IP como las que no.

    <CommonParameters>
      Este cmdlet admite los parámetros comunes Verbose, Debug,
      ErrorAction, ErrorVariable, WarningAction, WarningVariable,
      OutBuffer y OutVariable. Para obtener más información, escriba:
      "get-help about_commonparameters".

    -------------------------- EJEMPLO 1 --------------------------
    C:\PS>Get-NetworkConnection

    Se obtienen todas las conexiones de red del equipo local

    -------------------------- EJEMPLO 2 --------------------------
    C:\PS>Get-NetworkConnection -ComputerName 'Mortadelo-PC'

    Se obtienen todas las conexiones de red del equipo Mortadelo-PC.

    -------------------------- EJEMPLO 3 --------------------------
    C:\PS>Get-NetworkConnection -Equipo 'Mortadelo-PC' -PhysicalOnly

    Se obtienen todas las conexiones físicas de red del equipo Mortadelo-PC.

    -------------------------- EJEMPLO 4 --------------------------
    C:\PS>Get-NetworkConnection -E 'Mortadelo-PC' -P -IpOnly

    Se obtienen todas las conexiones físicas de red que estén habilitadas para
    IP, del equipo Mortadelo-PC.

    -------------------------- EJEMPLO 5 --------------------------
    C:\PS>Get-NetworkConnection -E 'Mortadelo-PC' -P -IP -AdapterType "Ethernet 802.3"

    Se obtienen todas las conexiones físicas de red que estén habilitadas para
    IP y sean de tipo "Ethernet 802.3", del equipo Mortadelo-PC.

    -------------------------- EJEMPLO 6 --------------------------
    C:\PS>$Cred = Get-Credential TIA\Bacterio
    C:\PS> Get-NetworkConnection -E 'Mortadelo-PC' -P -IP -T "Ethernet 802.3" -Credential $Cred

    Se obtienen todas las conexiones físicas de red que estén habilitadas para
    IP y sean de tipo "Ethernet 802.3", del equipo Mortadelo-PC. Para conectar a
    WMI, se usarán las credenciales del usuario TIA\Bacterio.

    -------------------------- EJEMPLO 7 --------------------------
    C:\PS>$Cred = Get-Credential TIA\Bacterio
    C:\PS> "Mortadelo-PC","Vicente-PC" | Get-NetworkConnection -P -Credential $Cred

    Se obtienen todas las conexiones físicas de red de los equipos Mortadelo-PC
    y Vicente-PC. Para conectar a WMI, se usarán las credenciales del usuario
    TIA\Bacterio.

    -------------------------- EJEMPLO 8 --------------------------
    C:\PS>$Cred = Get-Credential TIA\Bacterio
    C:\PS> $Equipos = Get-Content C:\Listados\Equipos.txt
    C:\PS> $Equipos | Get-NetworkConnection -P -Credential $Cred

    Se obtienen todas las conexiones físicas de red de los equipos listados en
    el fichero C:\Listados\Equipos.txt, cuyo contenido son los nombreso IPs de
    los equipos a listar, uno por línea. Para conectar a WMI, se usarán las
    credenciales del usuario TIA\Bacterio.

NOTAS
    Para ver los ejemplos, escriba: "get-help Get-NetworkConnection -examples".
    Para obtener más información, escriba: "get-help Get-NetworkConnection -detailed".
    Para obtener información técnica, escriba: "get-help Get-NetworkConnection -full".

Este es el código del Cmdlet:

Function Invoke-WmiExpression([string]$Expression,$Credential)
{
    # Si se ha recibido credenciales, las añadimos al comando
    If($Credential -ne $null -and `
      ($Credential.GetType()).Name -eq "PsCredential")
    {
        # Guardamos la expresión sin credenciales
        $ExpressionNoCredential = $Expression
        # Agregamos las credenciales al comando
        $Expression = "$Expression -Credential `$Credential"
    }
    # Limpiamos la variable de errores
    $Error.Clear()
    # Nos guardamos la configuración existente ante los errores que no
    # interrumpen
    $AccionError = $ErrorActionPreference
    # Establecemos que los errores que no interrumpen sí lo hagan, así
    # podremos capturarlos con Try/Catch
    $ErrorActionPreference = "Stop"
    Try
    {
        # Obtenemos los módulos de memoria del equipo
        $Devolucion = Invoke-Expression $Expression
    }
    Catch
    {
        # Si el error producido es provocado porque se ha intentado
        # pasar credenciales al equipo local...
        If($Error[0].Exception.ErrorCode -eq "LocalCredentials")
        {
            # Restituimos la expresión para que sea sin pedir credenciales
            $Expression = $ExpressionNoCredential
            # Volvemos a invocar la expresión para obtener los volúmenes
            $Devolucion = Invoke-Expression $Expression
        }
        Else
        {
            $Devolucion = $null
        }
    }
    # Restituimos la acción que estaba configurada para los errores que
    # no interrumpen
    $ErrorActionPreference = $AccionError
    $Devolucion
#.SYNOPSIS
#   Devuelve el resultado de una llamada que se hace a Get-WmiObject con la
#   cadena que se recibe como parámetro y que es pasada a Execute-Expression,
#   realizando control de errores.
#.DESCRIPTION
#   La princpal tarea de esta función es evitar la redundancia de código que
#   se produce al controlar el error que se genera si se realiza una llamada
#   a Get-WmiObject con credenciales alternativas al equipo local. En toda
#   función que realice este tipo de llamadas y que se quiera controlar este 
#   error, cuando usamos Try/Catch, el bloque de la función se coloca en la
#   parte Try y en el Catch hay que controlar si el error es por las
#   credenciales alternativas y en caso afirmativo volver a invocar
#   Get-WmiObject sin pasarlas, para a continuación volver a poner el bloque de
#   código, lo que lo duplica. En el código de la función que usa ésta, sólo se
#   tendrá que poner el bloque principal una vez, pues se convierte en
#   transparente si es el equipo local o no.
#.PARAMETER Expression
#   Cadena que es una llamada a Get-WmiObject.
#.PARAMETER Credential
#   Nombre de usuario o credenciales completas del usuario con el que se
#   conectara a WMI. En caso de pasarse sólo el nombre de usuario, se pedirá
#   entrar la contraseña del mismo. Si se pasan credenciales y se consulta el
#   equipo local, las credenciales serán ignoradas, pues no se puede conectar
#   a WMI del equipo local con credenciales alternativas. Tiene también los
#   alias "Usuario","U","Credenciales" y "Cred".
#.NOTES
#   Desarrollado por Fernando Reyes López
#   Noviembre de 2010
#.LINK
#   http://freyes.svetlian.com -> Artículos de Fernando reyes
#.LINK
#   https://urpiano.wordpress.com -> El Blog de GualtrySoft
#.EXAMPLE
#    PS >Invoke-WmiExpression "Get-WmiObject Win32_Process -ComputerName mortadelo-pc" -Credential (Get-Credential TIA\Bacterio)
#   Muestra por pantalla los procesos del equipo mortadelo-pc, pasando las
#   credenciales de un prestigioso científico y no importando si se trata del
#   equipo local o no; se pedirá al insigne profesor que entre su contraseña.
#.EXAMPLE
#    PS >$Usr = Get-Credential
#    PS >Invoke-WmiExpression "Get-WmiObject Win32_Process -ComputerName mortadelo-pc" -Credential (Get-Credential TIA\Bacterio)
#   Muestra por pantalla los procesos del equipo mortadelo-pc, pasando las
#   credenciales contenidas en $Usr y que fueron obtenidas invocando
#   Get-Credential.
}

Function Get-NetworkConnection {
    [CmdletBinding()]
    param(
        [parameter(Position=0,
                   ValueFromPipeLine=$True,
                   HelpMessage="Nombre de equipo.")]
            [Alias("Equipo","Sistema","E","C","S")]
            [String]$ComputerName = "$($env:ComputerName)",
        [parameter(Position=1,
                 Mandatory=$false,
                 HelpMessage="Credenciales de usuario de conexión")]
            [Alias("Usuario","U","Credenciales","Cred")]
            $Credential,
        [parameter(Position=2,
                   ValueFromPipeLine=$false,
                   HelpMessage="Tipo de conexión (ej, Ethernet 802.3).")]
            [Alias("TipoAdaptador","Tipo","TA","T")]
            [string]$AdapterType,
         [parameter(Position=3,
                    ValueFromPipeline=$false,
                    HelpMessage="Solo adaptadores físicos.")]
            [Alias("Physical","Fisico","P","F")]
            [switch]$PhysicalOnly,
         [parameter(Position=4,
                    ValueFromPipeLine=$False,
                    HelpMessage="Sólo conexiones habilitadas para IP")]
            [Alias("IP")]
            [switch]$IpOnly
         )
    Begin
    {
        # Iniciamos la devolución de la función. El hacerlo en el bloque Begin
        # permite que se vaya poblando con las distintas devoluciones que se
        # produzcan en el bloque Process para luego ser devuelto todo en el
        # bloque End. Esto permite que si se reciben el nombre del equipo por
        # canalización, y esta canalización implica toda una lista de equipos,
        # se puedan volcar los resultados de todos los equipos, también por
        # canalización, a otro Cmdlet, por ejemplo Export-Csv, lo que nos daría
        # un listado de todos los volumenes de todos los equipos que se
        # recibieran en la canalización; si no se hiciera con Begin/Process/End
        # el fichero obtenido con Export-Csv tan solo contendría los volúmenes
        # del último equipo procesado.
        $Devolucion = @()
        # Si no se han pasado unas credenciales completas, si no sólo un nombre
        # de usuario, hay que llamar a Get-Credential para obtenerlas completas
        If($Credential -ne $null -and `
          ($Credential.GetType()).Name -ne "PsCredential")
        {
                $Credential = Get-Credential $Credential
        }
        # Veremos ahora si hay que establecer filtros. En primer si sólo se
        # buscan adaptadores físicos
        If($PhysicalOnly -eq $True)
        {
            $Filter = "PhysicalAdapter = True"
            Write-Host $Filter
        }
        # A continuación si hay que filtrar en función del tipo de adaptador
        If($AdapterType.Length -gt 0)
        {
            # Por si también se filtra por adaptadores físicos, agregamos un
            # And y separamos con un espacio
            If($Filter.Length -gt 0){$Filtro = "$Filter And "}
            # Agregamos el filtro de tipo de adaptador
            $Filter = "$($Filter)AdapterType = `'$AdapterType`'"
        }
    }
    Process {
        # Si se recibió como nombre de equipo un punto, esto implica el equipo
        # local; sustituimos el punto por el nombre de equipo
        If($ComputerName -eq "."){$ComputerName = "$($env:ComputerName)"}
        # Mostramos el nombre del equipo en proceso. Importante el uso de
        # Write-Host, para evitar que el texto mostrado forme parte de la
        # devolución de la expresión
        Write-Host "Procesando $ComputerName"
        # Iniciamos la expresión que obtendrá la lista de adaptadores de red
        # consultando WMI, en concreto la clase Win32_NetworkAdapter del espacio
        # de nombres CIMv2
        $Expression = "Get-WmiObject Win32_NetworkAdapter"
        $Expression = "$Expression -Namespace root/CIMv2"
        # Agregamos el nombre de equipo
        $Expression = "$Expression -ComputerName $ComputerName"
        # Agregamos el filtro en el caso de existir
        If($Filter.Length -gt 0){$Expression = "$Expression -Filter `"$Filter`""}
        Write-Host $Expression
        #Obtenemos los adaptadores físicos invocando la expresión montada
        $PhysicalAdapters = Invoke-WmiExpression -Expression $Expression `
                                                 -Credential $Credential
        # Si se han obtenido adaptadores
        If($PhysicalAdapters -ne $null)
        {
            #Recorremos los adaptadores obtenidos
            ForEach($PhysicalAdapter In $PhysicalAdapters)
            {
            Write-Host $PhysicalAdapter.Name
                # Vamos ahora a obtener las propiedades de configuración del
                # adaptador actual.
                $Expression = "Get-WmiObject Win32_NetworkAdapterConfiguration"
                $Expression = "$Expression -Namespace root/CIMv2"
                # Agregamos el nombre de equipo
                $Expression = "$Expression -ComputerName $ComputerName"
                # Agregamos el filtro que apuntará al adaptador físico actual.
                # Para ello filtraremos la propiedad InterfaceIndex de
                # Win32_NetworkAdpaterConfiguration para que sea igual a la
                # propiedad IntrefaceIndex de Win32_NetworkAdapter
                $ConfigurationFilter = `
                           "InterfaceIndex = $($PhysicalAdapter.InterfaceIndex)"
                # Si sólo se buscan conexiones habilitadas para IP, lo agregamos
                # al filtro
                If($IpOnly -eq $true)
                {
                    $ConfigurationFilter = `
                                     "$ConfigurationFilter And IpEnabled = True"
                }
                # Agregamos el filtro a la expresión
                $Expression = "$Expression -Filter `"$ConfigurationFilter`""
                Write-Host $Expression
                #Obtenemos la configuración del adaptador
                $AdapterConfiguration = Invoke-WmiExpression `
                                                       -Expression $Expression `
                                                       -Credential $Credential
                If($AdapterConfiguration -ne $null)
                {
                    # Agregaremos al adaptador físico las propiedades más
                    # relevantes de su configuracion
                    $Resultado = $PhysicalAdapter
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name DHCPEnabled `
                               -Value $AdapterConfiguration.DHCPEnabled
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name DHCPLeaseObtained `
                               -Value $AdapterConfiguration.DHCPLeaseObtained
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name DHCPServer `
                               -Value $AdapterConfiguration.DHCPServer
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name DNSDomain `
                               -Value $AdapterConfiguration.DNSDomain
                    If($AdapterConfiguration.DNSDomainSuffixSearchOrder -ne $null)
                    {
                        Add-Member -InputObject $Resultado `
                          -MemberType NoteProperty `
                          -Name DNSDomainSuffixSearchOrder `
                          -Value ([string]::Join(',', `
                              $AdapterConfiguration.DNSDomainSuffixSearchOrder))
                    }
                    Else
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name DNSDomainSuffixSearchOrder `
                                   -Value $null
                    }
                    Add-Member -InputObject $Resultado `
                        -MemberType NoteProperty `
                        -Name DNSEnabledForWINSResolution `
                        -Value $AdapterConfiguration.DNSEnabledForWINSResolution
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name DNSHostName `
                               -Value $AdapterConfiguration.DNSHostName
                    If($AdapterConfiguration.DNSServerSearchOrder -ne $null)
                    {
                        Add-Member -InputObject $Resultado `
                                -MemberType NoteProperty `
                                -Name DNSServerSearchOrder `
                                -Value ([string]::Join(',', `
                                    $AdapterConfiguration.DNSServerSearchOrder))
                    }
                    Else
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name DNSServerSearchOrder `
                                   -Value $null
                    }
                    Add-Member -InputObject $Resultado `
                       -MemberType NoteProperty `
                       -Name DomainDNSRegistrationEnabled `
                       -Value $AdapterConfiguration.DomainDNSRegistrationEnabled
                    Add-Member -InputObject $Resultado `
                         -MemberType NoteProperty `
                         -Name FullDNSRegistrationEnabled `
                         -Value $AdapterConfiguration.FullDNSRegistrationEnabled
                    If($AdapterConfiguration.IPAddress -ne $null)
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name IPAddress `
                                   -Value ([string]::Join(',', `
                                               $AdapterConfiguration.IPAddress))
                    }
                    Else
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name IPAddress `
                                   -Value $null
                    }
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name IPConnectionMetric `
                               -Value $AdapterConfiguration.IPConnectionMetric
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name IpEnabled `
                               -Value $AdapterConfiguration.IpEnabled
                    Add-Member -InputObject $Resultado `
                            -MemberType NoteProperty `
                            -Name IPFilterSecurityEnabled `
                            -Value $AdapterConfiguration.IPFilterSecurityEnabled
                    Add-Member -InputObject $Resultado `
                            -MemberType NoteProperty `
                            -Name WINSEnableLMHostsLookup `
                            -Value $AdapterConfiguration.WINSEnableLMHostsLookup
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name WINSHostLookupFile `
                               -Value $AdapterConfiguration.WINSHostLookupFile
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name WINSPrimaryServer `
                               -Value $AdapterConfiguration.WINSPrimaryServer
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name WINSScopeID `
                               -Value $AdapterConfiguration.WINSScopeID
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name WINSSecondaryServer `
                               -Value $AdapterConfiguration.WINSSecondaryServer
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name DeadGWDetectEnabled `
                               -Value $AdapterConfiguration.DeadGWDetectEnabled
                    If($AdapterConfiguration.DefaultIPGateway -ne $null)
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name DefaultIPGateway `
                                   -Value ([string]::Join(',', `
                                        $AdapterConfiguration.DefaultIPGateway))
                    }
                    Else
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name DefaultIPGateway `
                                   -Value $null
                    }
                    If($AdapterConfiguration.GatewayCostMetric -ne $null)
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name GatewayCostMetric `
                                   -Value ([string]::Join(',', `
                                        $AdapterConfiguration.GatewayCostMetric))
                    }
                    Else
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name GatewayCostMetric `
                                   -Value $null
                    }
                    Add-Member -InputObject $Resultado `
                              -MemberType NoteProperty `
                              -Name IPPortSecurityEnabled `
                              -Value $AdapterConfiguration.IPPortSecurityEnabled
                    If($AdapterConfiguration.IPSecPermitIPProtocols -ne $null)
                    {
                        Add-Member -InputObject $Resultado `
                             -MemberType NoteProperty `
                             -Name IPSecPermitIPProtocols `
                             -Value ([string]::Join(',', `
                                  $AdapterConfiguration.IPSecPermitIPProtocols))
                    }
                    Else
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name IPSecPermitIPProtocols `
                                   -Value $null
                    }
                    If($AdapterConfiguration.IPSecPermitTCPPorts -ne $null)
                    {
                        Add-Member -InputObject $Resultado `
                             -MemberType NoteProperty `
                             -Name IPSecPermitTCPPorts `
                             -Value ([string]::Join(',', `
                                  $AdapterConfiguration.IPSecPermitTCPPorts))
                    }
                    Else
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name IPSecPermitTCPPorts `
                                   -Value $null
                    }
                    If($AdapterConfiguration.IPSecPermitUDPPorts -ne $null)
                    {
                        Add-Member -InputObject $Resultado `
                             -MemberType NoteProperty `
                             -Name IPSecPermitUDPPorts `
                             -Value ([string]::Join(',', `
                                     $AdapterConfiguration.IPSecPermitUDPPorts))
                    }
                    Else
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name IPSecPermitUDPPorts `
                                   -Value $null
                    }
                    If($AdapterConfiguration.IPSubnet -ne $null)
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name IPSubnet `
                                   -Value ([string]::Join(',', `
                                                $AdapterConfiguration.IPSubnet))
                    }
                    Else
                    {
                        Add-Member -InputObject $Resultado `
                                   -MemberType NoteProperty `
                                   -Name IPSubnet `
                                   -Value $null
                    }
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name IPUseZeroBroadcast `
                               -Value $AdapterConfiguration.IPUseZeroBroadcast
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name TcpipNetbiosOptions `
                               -Value $AdapterConfiguration.TcpipNetbiosOptions
                    # Agregamos el adaptador físico a la devolución
                    $Devolucion += $Resultado
                    # Vaciamos el resultado para que no "esté sucio" en la
                    # vuelta siguiente
                    $Resultado = $null
                }
            }
        }
    }
    End
    {
        # Devolvemos los resultados ordenados por nombre de equipo, conexión y
        # adaptador de red
        $Devolucion | Sort-Object SystemName,NetConnectionID,Caption
    }

#.SYNOPSIS
#    Enumera las de red de un equipo.
#
#.DESCRIPTION
#   Esta función tiene como devolución los objetos de la clase WMI 
#   Win32_NetworkAdapter, agregándole propiedades de la clase WMI
#   Win32_NetworkAdapterConfiguration, lo que permite obtener resultados
#   parecidos (aunque mucho más amplios) al comando IPCONFIG, ya que la
#   información suministrada por este comando junta la información de ambas
#   clases (como si de un Join de SQL se tratara, pues cada instancia de
#   una de ambas clases tiene su correspondiente en la otra) obteniendo así
#   la información de las conexiones de red.
#
#   La función permite recibir el nombre de equipo a enumerar por canalización,
#   así como suministrar credenciales alternativas, permitiendo obtener los
#   resultados de múltiples equipos cun una única ejecución.
#.PARAMETER ComputerName
#   Nombre o IP del equipo al que se consultará. Tiene también los alias
#   "Equipo","Sistema","E","C" y "S". Si se omite este parámetro, se obtienen
#   las conexiones de red del equipo local.
#.PARAMETER Credential
#   Nombre de usuario o credenciales completas del usuario con el que se
#   conectara a WMI. En caso de pasarse sólo el nombre de usuario, se pedirá
#   entrar la contraseña del mismo. Si se pasan credenciales y se consulta el
#   equipo local, las credenciales serán ignoradas, pues no se puede conectar
#   a WMI del equipo local con credenciales alternativas. Tiene también los
#   alias "Usuario","U","Credenciales" y "Cred". Si se omite este parámetro
#   la consulta a WMI la realiza el usuario que lanza la función.
#.PARAMETER AdapterType
#   Este parámetro permite especificar el tipo de adaptador de red que será
#   devuelto. Los posibles tipos son (el tipo "estrella" es "Ethernet 802.3",
#   que es el tipo de las NICs):
#       - "Ethernet 802.3" 
#       - "Token Ring 802.5" 
#       - "Fiber Distributed Data Interface (FDDI)" 
#       - "Wide Area Network (WAN)" 
#       - "LocalTalk" 
#       - "Ethernet using DIX header format" 
#       - "ARCNET" 
#       - "ARCNET (878.2)" 
#       - "ATM" 
#       - "Wireless" 
#       - "Infrared Wireless" 
#       - "Bpc" 
#       - "CoWan" 
#       - "1394"
#   Este parámetro tiene los alias "TipoAdaptador", "Tipo", "TA" y "T". Si se
#   omite este parámetro se enumeran todos los tipos de adaptador.
#.PARAMETER PhysicalOnly
#   Si se pasa este modificador, sólo las conexiones de red físicas serán
#   devueltas, si no se pasa se devuelven tanto las físicas como las lógicas.
#   Esta es una propiedad de la clase Win32_NetworkAdapter (PhysicalAdapter).
#   Este modificador tiene los alias "Physical", "Fisico", "P" y "F".
#.PARAMETER IpOnly
#   Si se pasa este modificador, sólo las conexiones cuya configuración esté
#   habilitada para IP serán devueltas. Esta es una propiedad de la clase
#   Win32_NetworkAdapterConfiguration (IpEnabled). Este modificador tiene el
#   alias "IP". Si se omite este parámetro, se obtienen tanto las que están
#   habilitadas para IP como las que no.
#.EXAMPLE
#    PS C:\> Get-NetworkConnection
# 
#    Se obtienen todas las conexiones de red del equipo local
#.EXAMPLE
#    PS C:\> Get-NetworkConnection -ComputerName 'Mortadelo-PC'
# 
#    Se obtienen todas las conexiones de red del equipo Mortadelo-PC.
#.EXAMPLE
#    PS C:\> Get-NetworkConnection -Equipo 'Mortadelo-PC' -PhysicalOnly
# 
#    Se obtienen todas las conexiones físicas de red del equipo Mortadelo-PC.
#.EXAMPLE
#    PS C:\> Get-NetworkConnection -E 'Mortadelo-PC' -P -IpOnly
# 
#    Se obtienen todas las conexiones físicas de red que estén habilitadas para
#   IP, del equipo Mortadelo-PC.
#.EXAMPLE
#    PS C:\> Get-NetworkConnection -E 'Mortadelo-PC' -P -IP -AdapterType "Ethernet 802.3"
# 
#    Se obtienen todas las conexiones físicas de red que estén habilitadas para
#   IP y sean de tipo "Ethernet 802.3", del equipo Mortadelo-PC.
#.EXAMPLE
#   PS C:\> $Cred = Get-Credential TIA\Bacterio
#    PS C:\> Get-NetworkConnection -E 'Mortadelo-PC' -P -IP -T "Ethernet 802.3" -Credential $Cred
# 
#    Se obtienen todas las conexiones físicas de red que estén habilitadas para
#   IP y sean de tipo "Ethernet 802.3", del equipo Mortadelo-PC. Para conectar a
#   WMI, se usarán las credenciales del usuario TIA\Bacterio.
#.EXAMPLE
#   PS C:\> $Cred = Get-Credential TIA\Bacterio
#    PS C:\> "Mortadelo-PC","Vicente-PC" | Get-NetworkConnection -P -Credential $Cred
# 
#    Se obtienen todas las conexiones físicas de red de los equipos Mortadelo-PC
#   y Vicente-PC. Para conectar a WMI, se usarán las credenciales del usuario
#   TIA\Bacterio.
#.EXAMPLE
#   PS C:\> $Cred = Get-Credential TIA\Bacterio
#   PS C:\> $Equipos = Get-Content C:\Listados\Equipos.txt
#    PS C:\> $Equipos | Get-NetworkConnection -P -Credential $Cred
# 
#    Se obtienen todas las conexiones físicas de red de los equipos listados en
#   el fichero C:\Listados\Equipos.txt, cuyo contenido son los nombreso IPs de
#   los equipos a listar, uno por línea. Para conectar a WMI, se usarán las
#   credenciales del usuario TIA\Bacterio.
#.NOTES
#   Desarrollado por Fernando Reyes López
#   Enero de 2011
#.LINK
#   http://freyes.svetlian.com -> Artículos de Fernando reyes
#.LINK
#   https://urpiano.wordpress.com -> El Blog de GualtrySoft

}

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: