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 impresoras conectadas por puerto TCP/IP

Posted by urpiano en Martes 26 \26\UTC octubre \26\UTC 2010

Esta función de PowerShell lista todas las impresoras, conectadas a un puerto TCP/IP, de un equipo, local o remoto. La función permite recibir el nombre del equipo a mirar por encaminamiento, lo que permite encaminar toda una lista de equipos y obtener un listado de sus impresoras conectadas por puerto TCP/IP. Se puede utilizar para inventariar todas las impresoras conectadas por IP que hay en una red, por ejemplo. La devolución está compuesta por objetos WMI de la clase Win32_Printer, a la que se agrega el nombre del equipo al que está conectada la impresora, la IP de la impresora, si responde a PING y un campo con el error que se hubiera producido al intentar listar las impresoras de un equipo o puerto TCP/IP de impresora; si no se ha producido error el valor de este último campo será nulo.

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-TCPIPPrinter

SINOPSIS
    Lista las impresoras conectadas por puerto TCP/IP a un equipo.


SINTAXIS
    Get-TCPIPPrinter [[-ComputerName] ] [[-Credential] ] []


DESCRIPCIÓN
    Este Cmdlet permite obtener un listado de todas las impresoras de un equipo
    que estén conectadas por un puerto TCP/IP. Permite recibir el nombre del
    equipo por canalización. Para obtener el listado, conecta a WMI y consulta
    la clase Win32_TCPIPPrinterPort del espacio de nombres Root/CIMv2; con la
    lista de puertos de impresora de tipo TCP/IP obtenida, consulta la impresora
    que esté conectada a dicho puerto (clase Win32_Printer).  El resultado es el
    propio objeto Win32_Printer, al que se agregan el nombre de equipo, la IP
    del puerto y si dicha IP responde o no a PING. La conexión a WMI se puede
    hacer con credenciales alternativas.


PARÁMETROS
    -ComputerName 
        Nombre o IP del equipo al que se consultará. Tiene también los alias
        "Equipo","Sistema","E","C" y "S".

    -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.

    
        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 --------------------------

    PS >Get-TCPIPPrinter

    Muestra por pantalla las impresoras del equipo local que están conectadas
    con un puerto TCP/IP.

    -------------------------- EJEMPLO 2 --------------------------

    PS >Get-TCPIPPrinter -ComputerName Mortadelo-PC -Credential TIA\Bacterio

    Muestra por pantalla las impresoras del equipo de nombre Mortadelo-PC que
    están conectadas con un puerto TCP/IP, conectando a WMI con el usuario
    TIA\Bacterio; se solicitará la contraseña de dicho usuario.

    -------------------------- EJEMPLO 3 --------------------------

    PS >"Mortadelo-PC","Filemon-PC" | Get-TCPIPPrinter -Cred TIA\Bacterio

    Muestra por pantalla las impresoras de los equipos de nombre Mortadelo-PC y
    Filemon-PC que están conectadas con un puerto TCP/IP, conectando a WMI con
    el usuario TIA\Bacterio; se solicitará la contraseña de dicho usuario.

    -------------------------- EJEMPLO 4 --------------------------

    PS >$Usuario = Get-Credential

    PS >"Mortadelo-PC","Filemon-PC" | Get-TCPIPPrinter -Usuario $Usuario
    Muestra por pantalla las impresoras de los equipos de nombre Mortadelo-PC y
    Filemon-PC que están conectadas con un puerto TCP/IP, conectando a WMI con
    el usuario establecido previamente con Get-Credential en la variable
    $Usuario.

    -------------------------- EJEMPLO 5 --------------------------

    PS >$Usr = Get-Credential

    PS >Get-Content c:\Equipos.txt | Get-TCPIPPrinter -U $Usr | Export-CSV c:\Prn.csv
    Este ejemplo muestra una manera muy útil de usar esta función. Guarda, en el
    fichero de valores separados por coma c:\Prn.csv, un listado con las
    impresoras, que están conectadas con un puerto TCP/IP, de los equipos
    listados en el fichero de texto c:\Equipos.txt, que contiene un nombre de
    equipo por línea, conectando a WMI con el usuario, establecido previamente

Este es el código del Cmdlet:

Function Get-TCPIPPrinter([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)
{

    Begin
    {
        $Devolucion = @()
        If($Credential -ne $null -and `
          ($Credential.GetType()).Name -ne "PsCredential")
        {
                $Credential = Get-Credential $Credencial
        }
    }
    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 del comando
        Write-Host "Procesando $ComputerName"
        # Iniciamos el comando que obtendrá la lista de puertos TCP/IP de
        # impresora WMI, en concreto la clase Win32_TCPIPPrinterPort del espacio
        # de nombres CIMv2
        $Comando = "Get-WmiObject Win32_TCPIPPrinterPort"
        $Comando = "$Comando -Namespace root/CIMv2"
        # Agregamos el nombre de equipo
        $Comando = "$Comando -ComputerName $ComputerName"
        # Si se han pasado credenciales
        If($Credential -ne $null)
        {
            # Agregamos las credenciales, guardando el comando sin ellas
            $ComandoSinCredenciales = $Comando
            $Comando = "$Comando -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"
        # Invocamos el comando montado para obtener la lista de puertos,
        # interceptando errores
        Try
        {
            $Puertos = Invoke-Expression $Comando
        }
        Catch
        {
            # Si el error producido es provocado porque se ha intentado pasar
            # credenciales al equipo local...
            If($Error[0].Exception.ErrorCode -eq "LocalCredentials")
            {
                # Restituimos el comando para que sea sin pedir credenciales
                $Comando = $ComandoSinCredenciales
                # Volvemos a invocar el comando para obtener los puertos
                $Puertos = Invoke-Expression $Comando
                # Guardamos que estamos en el equipo local
                $Local = $true
            }
            Else
            {
                Write-Host "$ComputerName`: $($Error[0].Exception.Message)" `
                           -ForegroundColor Red
                # Como se produce error generaremos un resultado en el que
                # todo tendrá valor nulo excepto el nombre del equipo y el error
                # que se ha producido. Por tanto, creamos un objeto para el 
                # resultado
                $Resultado = [WmiClass] "Win32_Printer"
                Add-Member -InputObject $Resultado `
                           -MemberType NoteProperty `
                           -Name Computer `
                           -Value $ComputerName
                Add-Member -InputObject $Resultado `
                           -MemberType NoteProperty `
                           -Name IP `
                           -Value $null
                Add-Member -InputObject $Resultado `
                           -MemberType NoteProperty `
                           -Name Error `
                           -Value $Error[0].Exception.Message
                Add-Member -InputObject $Resultado `
                           -MemberType NoteProperty `
                           -Name Responde `
                           -Value $null
                $Devolucion += $Resultado
            }
        }
        # Restituimos la acción que estaba configurada para los errores que no
        # interrumpen
        $ErrorActionPreference = $AccionError
        # Recorremos la lista de puertos obtenida, siempre y cuando no esté
        # vacía
        If($Puertos.Count -gt 0)
        {
            ForEach($Puerto In $Puertos)
            {
                # Iniciamos el comando que obtendrá la impresora conectada al
                # puerto, consultando la clase Win32_Printer del espacio
                # de nombres CIMv2, y filtrando por PortName
                $Comando = "Get-WmiObject Win32_Printer"
                $Comando = "$Comando -Namespace root/CIMv2"
                $Comando = "$Comando -Filter ""PortName = '$($Puerto.Name)'"""
                # Agregamos el nombre de equipo
                $Comando = "$Comando -ComputerName $ComputerName"
                # Si se han pasado credenciales y no es el equipo local
                If($Credential -ne $null -and $Local -ne $true)
                {
                    # Agregamos las credenciales, guardando el comando sin ellas
                    $ComandoSinCredenciales = $Comando
                    $Comando = "$Comando -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"
                # Invocamos el comando montado para obtener la lista de puertos,
                # interceptando errores
                Try
                {
                    # Ejecutamos el comando WMI
                    $Printer = Invoke-Expression $Comando
                    # Iniciamos la devolución del puerto actual
                    # Agregamos el nombre del equipo
                    Add-Member -InputObject $Printer `
                               -MemberType NoteProperty `
                               -Name Equipo `
                               -Value $ComputerName
                    # Agregamos la IP del puerto        
                    Add-Member -InputObject $Printer `
                               -MemberType NoteProperty `
                               -Name IP `
                               -Value $Puerto.HostAddress
                    # Agregamos un nulo para el error, al no haberse producido
                    # ninguno
                    Add-Member -InputObject $Printer `
                               -MemberType NoteProperty `
                               -Name Error `
                               -Value $null
                    # Agregamos si responde a PING
                    Add-Member -InputObject $Printer `
                               -MemberType NoteProperty `
                               -Name Responde `
                               -Value (Test-Connection $Puerto.HostAddress `
                                                       -Count 1 -Quiet)
                    # Agregamos el resultado a la devolución
                    $Devolucion += $Printer
                }
                Catch
                {
                   Write-Host "$($Puerto.Name)`: $($Error[0].Exception.Message)" `
                            -ForegroundColor Red
                    # Como se produce error generaremos un resultado en el que
                    # todo tendrá valor nulo excepto el nombre del equipo, la IP
                    # del puerto, si estta IP responde a PI y el error que se ha
                    # producido. Por tanto, creamos un objeto para el resultado
                    $Resultado = [WmiClass] "Win32_Printer"
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name Computer `
                               -Value $ComputerName
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name IP `
                               -Value $Puerto.HostAddress
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name Error `
                               -Value $Error[0].Exception.Message
                    Add-Member -InputObject $Resultado `
                               -MemberType NoteProperty `
                               -Name Responde `
                               -Value (Test-Connection $Puerto.HostAddress `
                                                       -Count 1 -Quiet)
                    $Devolucion += $Resultado
                }
            }
        }
    }
    End
    {
        #Realizamos la devolución
        $Devolucion
    }
#.SYNOPSIS
#   Lista las impresoras conectadas por puerto TCP/IP a un equipo.
#.DESCRIPTION
#   Este Cmdlet permite obtener un listado de todas las impresoras de un equipo
#   que estén conectadas por un puerto TCP/IP. Permite recibir el nombre del
#   equipo por canalización. Para obtener el listado, conecta a WMI y consulta
#   la clase Win32_TCPIPPrinterPort del espacio de nombres Root/CIMv2; con la
#   lista de puertos de impresora de tipo TCP/IP obtenida, consulta la impresora
#   que esté conectada a dicho puerto (clase Win32_Printer).  El resultado es el
#   propio objeto Win32_Printer, al que se agregan el nombre de equipo, la IP
#   del puerto y si dicha IP responde o no a PING. La conexión a WMI se puede
#   hacer con credenciales alternativas.
#.PARAMETER ComputerName
#   Nombre o IP del equipo al que se consultará. Tiene también los alias
#   "Equipo","Sistema","E","C" y "S".
#.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.
#.NOTES
#   Desarrollado por Fernando Reyes López
#   Octubre de 2010
#.LINK
#   http://freyes.svetlian.com -> Artículos de Fernando reyes
#.LINK
#   https://urpiano.wordpress.com -> El Blog de GualtrySoft
#.EXAMPLE
#     PS >Get-TCPIPPrinter
#   Muestra por pantalla las impresoras del equipo local que están conectadas
#   con un puerto TCP/IP.
#.EXAMPLE
#     PS >Get-TCPIPPrinter -ComputerName Mortadelo-PC -Credential TIA\Bacterio
#   Muestra por pantalla las impresoras del equipo de nombre Mortadelo-PC que
#   están conectadas con un puerto TCP/IP, conectando a WMI con el usuario
#   TIA\Bacterio; se solicitará la contraseña de dicho usuario.
#.EXAMPLE
#     PS >"Mortadelo-PC","Filemon-PC" | Get-TCPIPPrinter -Cred TIA\Bacterio
#   Muestra por pantalla las impresoras de los equipos de nombre Mortadelo-PC y
#   Filemon-PC que están conectadas con un puerto TCP/IP, conectando a WMI con
#   el usuario TIA\Bacterio; se solicitará la contraseña de dicho usuario.
#.EXAMPLE
#     PS >$Usuario = Get-Credential
#     PS >"Mortadelo-PC","Filemon-PC" | Get-TCPIPPrinter -Usuario $Usuario
#   Muestra por pantalla las impresoras de los equipos de nombre Mortadelo-PC y
#   Filemon-PC que están conectadas con un puerto TCP/IP, conectando a WMI con
#   el usuario establecido previamente con Get-Credential en la variable
#   $Usuario.
#.EXAMPLE
#     PS >$Usr = Get-Credential
#     PS >Get-Content c:\Equipos.txt | Get-TCPIPPrinter -U $Usr | Export-CSV c:\Prn.csv
#   Este ejemplo muestra una manera muy útil de usar esta función. Guarda, en el
#   fichero de valores separados por coma c:\Prn.csv, un listado con las
#   impresoras, que están conectadas con un puerto TCP/IP, de los equipos
#   listados en el fichero de texto c:\Equipos.txt, que contiene un nombre de
#   equipo por línea, conectando a WMI con el usuario, establecido previamente
#   con Get-Credential, en la variable $Usr.
}

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: