Compartir a través de


Windows PowerShell: Buceo profundo en Remoting

Interacción remota es uno los aspectos más eficaces de Windows PowerShell, por lo que bien vale la pena analizar en un nivel más profundo.

Don Jones

Interacción remota es una de las características más útiles y más notables de Windows PowerShell. Este mes, profundicemos un poco más allá de interacción remota y cómo funciona y, a continuación, tenga en cuenta algunas formas más para que sea una herramienta eficaz y valioso de producción.

Ir de interacción remota

En primer lugar, tenga en cuenta que necesitará para habilitar el control remoto en cualquier equipo que desea remoto en. Para ello, ejecute Enable-PSRemoting en el equipo de destino, o configurar la interacción remota a través de la directiva de grupo. Puede ejecutar about_remote_troubleshooting de la Ayuda de cualquier copia de la versión 2 para obtener instrucciones acerca de Windows PowerShell.

Interacción remota requieren la instalación de Windows PowerShell versión 2. Puede descargar desde el shell de la Sitio Web de Microsoft para cualquier versión de Windows a Windows XP. Use la interacción remota también abrir un puerto TCP en los equipos en los que está habilitado. Si está utilizando el Firewall de Windows, el cmdlet Enable-PSRemoting creará automáticamente la conexión de servidor de seguridad necesarias.

Interacción remota de uno a uno

La forma más sencilla de utilizar remoting es como un shell interactivo, mucho como Secure Shell (SSH) en sistemas Unix o Linux. Ejecute –computernameserver de PSSession de ENTRAR, donde servidor es el nombre del equipo remoto.

Es necesario utilizar el nombre del equipo real, no un alias o una dirección IP. Esto "funcionan" en un entorno de dominio una vez habilitada la interacción remota, uso de Kerberos para autenticar mutuamente a usted y el equipo remoto. En un entorno que no sea de dominio, el about_remote_troubleshooting tema de Ayuda del shell tiene instrucciones para configurar los equipos.

Tenga en cuenta que las credenciales se delegan en el equipo remoto. Los comandos que se ejecuta en el se ejecutará bajo sus credenciales, no de alguna cuenta de sistema todopoderosos. No puede delegar las credenciales a través de saltos adicionales, sin embargo, por lo que no se puede por lo general remoto a otro equipo mientras tiene abierto el indicador de shell remoto. Para cerrar la conexión y volver a su equipo, ejecute PSSession de salida.

Interacción remota de uno a varios

El verdadero poder de interacción remota es la capacidad de enviar un comando, en paralelo, a uno o varios equipos remotos. Cada equipo remoto que ejecuta el comando, los objetos resultantes serializa en XML y transmite los resultados al equipo a través de la red.

El equipo recibe el código XML y deserializa en objetos estáticos. Esto le permite trabajar con la salida del comando de prácticamente la misma manera que cualquier otro resultado del comando.

Todo comienza con el cmdlet Invoke-Command. En su forma más sencilla, simplemente hay que especificar un comando para ejecutar, en la forma de un bloque de script y uno o más equipos en la que desee ejecutar ese comando. Por ejemplo, para leer una lista de nombres de equipo de un archivo de texto (un nombre por línea) y ejecutar un comando en cada uno de ellos, utilice:

Invoke-Command –scriptblock {–newest de seguridad de Get-EventLog 200}

– ComputerName (get-Content computernames.txt)

Cuando los resultados se obtienen a su equipo, tendrán una adicional PSComputerName llama a la propiedad adjuntado. Esto le permite ver qué resultado procede del equipo. Esto es útil porque puede que no todos se recibirán en el mismo orden.

Puede utilizar esta propiedad para ordenar, agrupar, filtrar o manipular el resultado de una vez que se recibe en su equipo. Intente evitar ordenar cuando tiene una enorme cantidad de datos que se vuelvan, ya que tiene el cmdlet de Sort-Object para almacenar en caché el resultado en la memoria a fin de realizar a una ordenación.

Invoke-Command también admite un parámetro de –FilePath. Puede utilizar este parámetro en lugar de –ScriptBlock para especificar una secuencia de comandos para ejecutar, en lugar de ejecutar un comando o dos. También existen parámetros que ayudan a especificar unas credenciales distintas o reemplazar valores predeterminados:

  • – Credential permite especificar un nombre de usuario y se le pedirá la contraseña. Esta credencial se conecte a los equipos remotos y ejecutar el comando o secuencia de comandos. También puede proporcionar un objeto de credencial creado con el comando Get-Credential.
  • –Port le permite especificar un puerto distinto del predeterminado. Utilice esta opción si ha vuelto a configurar el servicio de administración remota de Windows (WinRM) subyacente para que escuche en un puerto diferente.
  • –UseSSL obliga a la conexión que estar cifrados y utiliza un puerto TCP diferente (similar a la manera en que HTTPS utiliza un puerto distinto de HTTP no cifrado).
  • –ThrottleLimit permite cambiar el número de equipos que se puede establecer contacto contactado en paralelo desde el valor predeterminado es 32. Este valor predeterminado se ha probado correctamente en entornos muy grandes y provocar se consumen más el procesador y memoria del equipo, por lo que se tenga cuidado cuando utilice este parámetro.

Obtener la entrada a comandos remotos

Hay dos parámetros adicionales de Invoke-Command que se suele pasar por alto. El primero es –ArgumentList, que sólo se puede utilizar junto con –ScriptBlock (y no con –FilePath). El parámetro –ArgumentList está diseñado para pasar las variables locales del equipo en el comando que se envían a los equipos remotos.

Dentro del bloque de secuencia de comandos, se define un bloque de parámetros que declara variables para utilizarse en los equipos remotos. La lista de argumentos, a continuación, se pasa a esas variables. Éste es un ejemplo:

–Scriptblock – computername de Invoke-Command Servidor1 {param($one,$two) Get-EventLog –logname una –newest $dos} $ –ArgumentList (log), la cantidad de $

En este caso, la secuencia de comandos va a pasar el contenido de la variable local variable $ inicie sesión en la variable $uno y se usa para definir el nombre de registro que se recupera. Se se pase la cantidad de $ variable local en la variable $dos y utilice para definir el número de entradas de registro de eventos recuperada. El paso de argumentos se realiza exclusivamente por orden: registro de $log va a $one porque está tanto aparece en primer lugar, y $quality va a $two porque ambos está aparece en segundo lugar.

El parámetro –InputObject es otro medio de proporcionar una entrada a los equipos remotos y funciona con –ScriptBlock y –FilePath. Cualquiera de los dos objetos se especifican para el parámetro –InputObject se pasan al comando remoto o secuencia de comandos en la variable de entrada especial de $.

Obtención de salida de comandos remotos

Suponiendo que está ejecutando un único, un comando simple, como Get-EventLog, conseguirá que los resultados del comando de Invoke-Command. Por ejemplo, si desea volcado todo el contenido a un archivo XML para más tarde, utilice:

– ComputerName de Invoke-Command uno, dos, tres –scriptblock {–newest de seguridad de Get-EventLog 100} | CliXML de exportación results.xml

Si está ejecutando una secuencia de comandos completa en el equipo remoto, entonces la secuencia de comandos debe generar objetos, preferiblemente en un único tipo de objeto, como resultado. Por ejemplo, la siguiente secuencia de comandos está diseñado para ser enviados a equipos remotos mediante el parámetro –FilePath de Invoke-Command. Tenga en cuenta cómo se crea un nuevo objeto y combina la información desde los dos objetos locales. El objeto personalizado combinado es la salida a la canalización, que se transmite al equipo que se ejecutó Invoke-Command:

$os = Get-WmiObject pueden Win32_OperatingSystem

bios de $ = Get-WmiObject pueden Win32_BIOS

$obj = New-Object (–TypeNamePSObject)

$obj | Agregar miembro $os.caption de NotePropertyOSVersion

$obj | Agregar miembro $bios.serialnumber de NotePropertyBIOSSerial

Salida de escritura $obj

La propiedad PSComputerName se agregará automáticamente, por lo que tendrá que podrá indicar a qué resultado procede del equipo. Generar la salida de un único tipo de objeto de este modo proporciona la mejor compatibilidad con el resto de las capacidades del shell y definitivamente es la forma de "mejores prácticas" de enviar la salida de una secuencia de comandos invocado de forma remota.

Joshua Hoffman

Don Jones es un destinatario del premio MVP de Microsoft y el autor de "Aprender Windows PowerShell en un mes de almuerzos" (Manning publicaciones Co., 2010), un libro diseñado para ayudar a cualquier administrador entrarán en vigencia con Windows PowerShell. Jones también ofrece formación pública y en el sitio de Windows PowerShell. Póngase en contacto con él a través de su sitio Web en ConcentratedTech.com.

Contenido relacionado