Invoke-Command

Ejecuta comandos en los equipos local y remoto.

Sintaxis

Invoke-Command [-ScriptBlock] <scriptblock> [[-ComputerName] <string[]>] [-ApplicationName <string>] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-CertificateThumbprint <string>] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-Port <int>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-UseSSL] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-FilePath] <string> [[-ComputerName] <string[]>] [-ApplicationName <string>] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-Port <int>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-UseSSL] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-FilePath] <string> [[-Session] <PSSession[]>] [-AsJob] [-HideComputerName] [-JobName <string>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-FilePath] <string> [[-ConnectionURI] <Uri[]>] [-AllowRedirection] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-ScriptBlock] <scriptblock> [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-ScriptBlock] <scriptblock> [[-Session] <PSSession[]>] [-AsJob] [-HideComputerName] [-JobName <string>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Invoke-Command [-ScriptBlock] <scriptblock> [[-ConnectionURI] <Uri[]>] [-AllowRedirection] [-AsJob] [-Authentication {<Default> | <Basic> | <Negotiate> | <NegotiateWithImplicitCredential> | <Credssp> | <Digest> | <Kerberos>}] [-CertificateThumbprint <string>] [-ConfigurationName <string>] [-Credential <PSCredential>] [-HideComputerName] [-JobName <string>] [-SessionOption <PSSessionOption>] [-ThrottleLimit <int>] [-ArgumentList <Object[]>] [-InputObject <psobject>] [<CommonParameters>]

Descripción

El cmdlet Invoke-Command ejecuta comandos en un equipo local o remoto y devuelve todos los resultados de los comandos, incluidos los errores. Con un solo comando Invoke-Command se pueden ejecutar comandos en varios equipos.

Para ejecutar un solo comando en un equipo remoto, utilice el parámetro ComputerName. Para ejecutar una serie de comandos relacionados que comparten datos, cree una PSSession (una conexión persistente) en el equipo remoto y, a continuación, utilice el parámetro Session de Invoke-Command para ejecutar el comando en la PSSession.

También puede utilizar Invoke-Command en un equipo local para evaluar o ejecutar una cadena en un bloque de script como un comando. Windows PowerShell convierte el bloque de script en un comando y ejecuta el comando inmediatamente en el ámbito actual, en lugar de solo hacer eco de la cadena en la línea de comandos.

Antes de utilizar Invoke-Command para ejecutar comandos en un equipo remoto, vea about_Remote.

Parámetros

-AllowRedirection

Permite la redirección de esta conexión a un identificador URI alternativo.

Cuando se utiliza el parámetro ConnectionURI, el destino remoto puede devolver una instrucción de redirección a otro URI. De forma predeterminada, Windows PowerShell no redirige conexiones, pero se puede usar el parámetro AllowRedirection para permitir que se redirija la conexión.

Puede limitar igualmente el uso de veces que se redirige la conexión estableciendo la propiedad MaximumConnectionRedirectionCount de la variable de preferencia $PSSessionOption o la propiedad MaximumConnectionRedirectionCount del valor del parámetro SessionOption. El valor predeterminado es 5. Para obtener más información, vea la descripción del parámetro SessionOption y el tema de Ayuda para el cmdlet New-PSSessionOption.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

-ApplicationName <string>

Especifica el segmento del nombre de aplicación del identificador URI de la conexión. Utilice este parámetro para especificar el nombre de aplicación cuando no está utilizando el parámetro ConnectionURI del comando.

El valor predeterminado es el valor de la variable de preferencia $PSSessionApplicationName en el equipo local. Si no se define esta variable de preferencia, el valor predeterminado es WSMAN. Este valor resulta apropiado en la mayoría de los casos. Para obtener más información, vea about_Preference_Variables.

El servicio WinRM utiliza el nombre de aplicación para seleccionar un agente de escucha a fin de atender la solicitud de conexión. El valor de este parámetro debe coincidir con el valor de la propiedad URLPrefix de un agente de escucha en el equipo remoto.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

WSMAN

¿Aceptar canalización?

true (ByPropertyName)

¿Aceptar caracteres comodín?

false

-ArgumentList <Object[]>

Proporciona los valores de las variables locales en el comando. Las variables en el comando se reemplazan con estos valores antes de que se ejecute el comando en el equipo remoto. Escriba los valores en una lista separada por comas. Los valores se asocian a las variables en el orden en que aparecen en la lista. El alias de ArgumentList es "Args".

Los valores de ArgumentList pueden ser valores reales, como "1024", o referencias a variables locales, como "$max".

Para usar variables locales en un comando, utilice el siguiente formato de comando:

{param($<nombre1>[, $<nombre2>]...) <comandoConVariablesLocales>} -ArgumentList <valor | $variableLocal>

La palabra clave "param" muestra las variables locales que se usan en el comando. El parámetro ArgumentList proporciona los valores de las variables, según el orden en que se muestran.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

-AsJob

Ejecuta el comando como un trabajo en segundo plano en un equipo remoto. Use este parámetro para ejecutar comandos que tardan mucho tiempo en completarse.

Cuando se utiliza AsJob, el comando devuelve un objeto que representa el trabajo y, a continuación, muestra el símbolo del sistema. Puede seguir trabajando en la sesión mientras se completa el trabajo. Para administrar el trabajo, use los cmdlets Job. Para obtener los resultados del trabajo, use Receive-Job.

El parámetro AsJob es similar al uso de Invoke-Command para ejecutar un comando Start-Job de forma remota. Sin embargo, con AsJob, el trabajo se crea en el equipo local, aunque el trabajo se ejecute en un equipo remoto, y los resultados del trabajo remoto se devuelven automáticamente al equipo local.

Para obtener más información sobre los trabajos en segundo plano en Windows PowerShell, vea about_Jobs y about_Remote_Jobs.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

ninguno

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

-Authentication <AuthenticationMechanism>

Especifica el mecanismo que se utiliza para autenticar las credenciales del usuario. Los valores válidos son Default, Basic, Credssp, Digest, Kerberos, Negotiate y NegotiateWithImplicitCredential. El valor predeterminado es Default.

La autenticación CredSSP está disponible solo en Windows Vista, Windows Server 2008 y versiones posteriores de Windows.

Para obtener información acerca de los valores de este parámetro, vea la descripción de la enumeración System.Management.Automation.Runspaces.AuthenticationMechanism en MSDN.

PRECAUCIÓN: la autenticación Credential Security Service Provider (CredSSP), en la que las credenciales del usuario pasan a un equipo remoto para su autenticación, está diseñada para los comandos que requieren autenticación en más de un recurso, como acceso a un recurso compartido de red remota. Este mecanismo aumenta el riesgo que supone la operación remota para la seguridad. Si el equipo remoto está en peligro, las credenciales que se le pasen podrán usarse para controlar la sesión de red.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

Default

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

-CertificateThumbprint <string>

Especifica el certificado de clave pública digital (X509) de una cuenta de usuario que tiene permiso para realizar esta acción. Escriba la huella digital del certificado.

Los certificados se usan en una autenticación basada en certificados del cliente. Pueden asignarse únicamente a cuentas de usuario locales; no funcionan con cuentas de dominio.

Para obtener la huella digital de un certificado, se utilizan los comandos Get-Item o Get-ChildItem en la unidad Cert: de Windows PowerShell.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

-ComputerName <string[]>

Especifica los equipos en los que se ejecuta el comando. El valor predeterminado es el equipo local.

Cuando se utiliza el parámetro ComputerName, Windows PowerShell crea una conexión temporal que se utiliza solamente para ejecutar el comando especificado y se cierra a continuación. Si necesita una conexión persistente, utilice el parámetro Session.

Escriba el nombre NETBIOS, la dirección IP o el nombre de dominio completo de uno o varios equipos en una lista de valores separados por comas. Para especificar el equipo local, escriba el nombre del equipo, "localhost", o bien, un punto (.).

Para usar una dirección IP en el valor del parámetro ComputerName, el comando debe incluir el parámetro Credential. Se debe configurar igualmente el equipo para el transporte HTTPS o la dirección IP del equipo remoto debe estar incluida en la lista TrustedHosts de WinRM del equipo local. Para obtener instrucciones a fin de agregar un nombre de equipo a la lista TrustedHosts, vea el tema sobre cómo agregar un equipo a la lista de hosts de confianza en about_Remote_Troubleshooting.

Nota: en Windows Vista y versiones posteriores de Windows, para incluir el equipo local en el valor del parámetro ComputerName, debe abrir Windows PowerShell con la opción "Ejecutar como administrador".

¿Requerido?

false

¿Posición?

1

Valor predeterminado

¿Aceptar canalización?

true (ByPropertyName)

¿Aceptar caracteres comodín?

false

-ConfigurationName <string>

Especifica la configuración de sesión que se usa para la nueva sesión de PowerShell.

Escriba un nombre de configuración o el URI de recurso completo para una configuración de sesión. Si se especifica únicamente el nombre de configuración, se antepone el siguiente identificador URI de esquema: http://schemas.microsoft.com/powershell.

La configuración de una sesión se encuentra en el equipo remoto. Si la configuración de sesión especificada no existe en el equipo remoto, el comando generará un error.

El valor predeterminado es el valor de la variable de preferencia $PSSessionConfigurationName en el equipo local. Si esta variable de preferencia no está establecida, el valor predeterminado es Microsoft.PowerShell. Para obtener más información, vea about_Preference_Variables.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

http://Schemas.Microsoft.com/PowerShell/Microsoft.PowerShell

¿Aceptar canalización?

true (ByPropertyName)

¿Aceptar caracteres comodín?

false

-ConnectionURI <Uri[]>

Especifica un identificador uniforme de recursos (URI) que define el extremo de la conexión. El identificador URI debe ser completo.

El formato de esta cadena es:

<Transporte>://<nombreDeEquipo>:<Puerto>/<nombreDeAplicación>

El valor predeterminado es:

http://localhost:80/WSMAN

Los valores válidos para el segmento Transport del URI son HTTP y HTTPS. Si no se especifica un ConnectionURI, se pueden utilizar los parámetros UseSSL, ComputerName, Port y ApplicationName para especificar los valores URI.

Si el equipo de destino redirige la conexión a un identificador URI diferente, Windows PowerShell impide la redirección, a menos que se use el parámetro AllowRedirection en el comando.

¿Requerido?

false

¿Posición?

1

Valor predeterminado

http://localhost:80/wsman

¿Aceptar canalización?

true (ByPropertyName)

¿Aceptar caracteres comodín?

false

-Credential <PSCredential>

Especifica una cuenta de usuario con permiso para realizar esta acción. El valor predeterminado es el usuario actual.

Escriba un nombre de usuario, como "Usuario01" o "Dominio01\Usuario01", o bien, escriba una variable que contenga un objeto PSCredential, como uno generado por el cmdlet Get-Credential. Cuando escriba un nombre de usuario, se le solicitará una contraseña.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

¿Aceptar canalización?

true (ByPropertyName)

¿Aceptar caracteres comodín?

false

-FilePath <string>

Ejecuta el script local especificado en uno o varios equipos remotos. Escriba la ruta de acceso y el nombre de archivo del script o canalice una ruta de acceso de script a Invoke-Command. El script debe residir en el equipo local o en un directorio al que pueda obtener acceso el equipo local. Utilice el parámetro ArgumentList para especificar los valores de parámetros en el script.

Cuando se utiliza este parámetro, Windows PowerShell convierte el contenido del archivo de script especificado en un bloque de script, transmite el bloque de script al equipo remoto y lo ejecuta en el equipo remoto.

¿Requerido?

true

¿Posición?

2

Valor predeterminado

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

-HideComputerName

Omite de la presentación de resultados el nombre de equipo de cada objeto. De forma predeterminada, se muestra en la pantalla el nombre del equipo que generó el objeto.

Este parámetro afecta únicamente a la presentación de resultados. No cambia el objeto.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

-InputObject <psobject>

Especifica la entrada al comando. Especifique la variable que contiene los objetos o escriba un comando o una expresión que los obtenga.

Cuando se utiliza InputObject, debe usarse la variable automática $input en el valor del parámetro ScriptBlock para representar los objetos de entrada.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

¿Aceptar canalización?

true (ByValue)

¿Aceptar caracteres comodín?

false

-JobName <string>

Especifica un nombre simple para el trabajo en segundo plano. De forma predeterminada, los trabajos se denominan "Trabajo<n>", donde <n> es un número ordinal. Este parámetro es válido únicamente con el parámetro AsJob.

Si usa el parámetro JobName en un comando, este se ejecutará como un trabajo e Invoke-Command devolverá un objeto de trabajo, aunque no se incluya el parámetro AsJob en el comando.

Para obtener más información sobre los trabajos en segundo plano en Windows PowerShell, vea about_Jobs.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

Job<n>

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

-Port <int>

Especifica el puerto de red en el equipo remoto utilizado para este comando. El valor predeterminado es el puerto 80 (puerto HTTP).

Antes de usar un puerto alternativo, debe configurar la escucha de WinRM en el equipo remoto para escuchar en ese puerto. Para configurar el agente de escucha, escriba los dos comandos siguientes en el símbolo del sistema de Windows PowerShell:

remove-item -path wsman:\Localhost\listener\listener* -recurse

new-item -path wsman:\Localhost\listener -Transport http -Address * -port <númeroDePuerto>

El parámetro Port no se debe usar a menos que sea imprescindible. El puerto configurado en el comando se aplica a todos los equipos o sesiones en que el comando se ejecuta. La configuración de un puerto alternativo puede impedir la ejecución del comando en todos los equipos.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

-ScriptBlock <scriptblock>

Especifica los comandos que se han de ejecutar. Incluya los comandos entre llaves ({}) para crear un bloque de script. Este parámetro es obligatorio.

De forma predeterminada, las variables del comando se evalúan en el equipo remoto. Para incluir variables locales en el comando, utilice el parámetro ArgumentList.

¿Requerido?

true

¿Posición?

1

Valor predeterminado

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

-Session <PSSession[]>

Ejecuta el comando en las sesiones de Windows PowerShell (PSSessions) especificadas. Escriba una variable que contenga las PSSessions o un comando que las cree u obtenga, como un comando New-PSSession o Get-PSSession.

Cuando se crea una PSSession, Windows PowerShell establece una conexión persistente con el equipo remoto. Utilice una PSSession para ejecutar una serie de comandos relacionados que comparten datos. Para ejecutar un solo comando o una serie de comandos no relacionados, utilice el parámetro ComputerName.

Para crear una PSSession, se utiliza el cmdlet New-PSSession. Para obtener más información, vea about_PSSessions.

¿Requerido?

false

¿Posición?

1

Valor predeterminado

¿Aceptar canalización?

true (ByPropertyName)

¿Aceptar caracteres comodín?

false

-SessionOption <PSSessionOption>

Establece opciones avanzadas para la sesión. Se debe especificar un objeto SessionOption creado mediante el cmdlet New-PSSessionOption.

Los valores predeterminados para las opciones los determina el valor de la variable de preferencia $PSSessionOption, si se ha definido. De lo contrario, la sesión utiliza los valores predeterminados del sistema.

Para obtener una descripción de las opciones de sesión, incluidos los valores predeterminados, vea el tema de ayuda del cmdlet New-PSSessionOption. Para obtener información acerca de la variable de preferencia $PSSessionOption, vea about_Preference_Variables.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

-ThrottleLimit <int>

Especifica el número máximo de conexiones simultáneas que se pueden establecer para ejecutar este comando. Si omite este parámetro o escribe un valor 0, se utilizará el valor predeterminado 32.

Este límite se aplica únicamente al comando actual; no se aplica a la sesión ni al equipo.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

32

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

-UseSSL

Use el protocolo Capa de sockets seguros (SSL) para establecer una conexión con el equipo remoto. De forma predeterminada, no se usa SSL.

WS-Management cifra todo el contenido de Windows PowerShell que se transmite a través de la red. UseSSL es una protección adicional que envía los datos a través de HTTPS en lugar de HTTP.

Si se usa este parámetro pero SSL no está disponible en el puerto utilizado para el comando, se producirá un error en el comando.

¿Requerido?

false

¿Posición?

named

Valor predeterminado

¿Aceptar canalización?

false

¿Aceptar caracteres comodín?

false

<CommonParameters>

Este cmdlet admite los parámetros comunes: -Verbose, -Debug, -ErrorAction, -ErrorVariable, -OutBuffer y -OutVariable. Para obtener más información, vea about_Commonparameters.

Entradas y salidas

El tipo de entrada es el tipo de los objetos que se pueden canalizar al cmdlet. El tipo devuelto es el tipo de los objetos que el cmdlet devuelve.

Entradas

System.Management.Automation.ScriptBlock

Puede canalizar un comando en un bloque de script a Invoke-Command. Utilice la variable automática $input para representar los objetos de entrada en el comando.

Salidas

System.Management.Automation.PSRemotingJob o el resultado del comando que se ha invocado

Cuando se usa el parámetro AsJob, Invoke-Command devuelve un objeto de trabajo. De lo contrario, devuelve los resultados del comando invocado (el valor del parámetro ScriptBlock).

Notas

-- En Windows Vista y versiones posteriores de Windows, para usar el parámetro ComputerName de Invoke-Command para ejecutar un comando en el equipo local, debe abrir Windows PowerShell con la opción "Ejecutar como administrador".

-- Cuando se ejecutan comandos en varios equipos, Windows PowerShell conecta con los equipos en el orden en que aparecen en la lista. Sin embargo, los resultados de los comandos se muestran en el orden en que se reciben de los equipos remotos, que podrían ser diferentes.

-- Los errores debidos al comando que Invoke-Command ejecuta se incluyen en los resultados del comando. Los errores que serían errores fatales en un comando local se tratan como errores que no son fatales en un comando remoto. Esta estrategia garantiza que los errores fatales en un equipo no finalicen el comando en todos los equipos en que se ejecuta. Esta práctica se utiliza aunque un comando remoto se ejecute en un solo equipo.

-- Si el equipo remoto no está en un dominio de confianza para el equipo local, es posible que el equipo no pueda autenticar las credenciales del usuario. Para agregar el equipo remoto a la lista de "hosts de confianza" en WS-Management, se debe utilizar el comando siguiente en el proveedor WSMAN, donde <nombreDeEquipoRemoto> es el nombre del equipo remoto:

set-item -path wsman:\Localhost\Client\TrustedHosts -value <nombreDeEquipoRemoto>.

Ejemplo 1

C:\PS>invoke-command -filepath c:\scripts\test.ps1 -computerName Server01

Disks: C:, D:, E:
Status: Warning, Normal, Normal

Descripción
-----------
Este comando ejecuta el script Test.ps1 en el equipo Servidor01. 

El comando utiliza el parámetro FilePath para especificar un script que se encuentra en el equipo local. El script se ejecuta en el equipo remoto y los resultados se devuelven en el equipo local.





Ejemplo 2

C:\PS>invoke-command -computername server01 -credential domain01\user01 -scriptblock {get-culture}

Descripción
-----------
Este comando ejecuta un comando Get-Culture en el equipo remoto Server01. 

Utiliza el parámetro ComputerName para especificar el nombre de equipo y el parámetro Credential para ejecutar el comando en el contexto de seguridad de "Dominio01\Usuario01", un usuario con permiso para ejecutar comandos. Utiliza el parámetro ScriptBlock para especificar el comando que se va a ejecutar en el equipo remoto.

Como respuesta, Windows PowerShell muestra un cuadro de diálogo que solicita la contraseña y un método de autenticación para la cuenta de Usuario01. A continuación, ejecuta el comando en el equipo Server01 y devuelve el resultado.





Ejemplo 3

C:\PS>$s = new-pssession -computername server02 -credential domain01\user01

C:\PS> invoke-command -session $s -scriptblock {get-culture}

Descripción
-----------
En este ejemplo se ejecuta el mismo comando "Get-Culture" en una sesión (una conexión persistente) en el equipo remoto Server02. Normalmente, se crea una sesión solo cuando se está ejecutando una serie de comandos en el equipo remoto.

El primer comando utiliza el cmdlet New-PSSession para crear una sesión en el equipo remoto Server02. A continuación, guarda la sesión en la variable $s.

El segundo comando usa el cmdlet Invoke-Command para ejecutar el comando Get-Culture en Server02. Utiliza el parámetro Session para especificar la sesión guardada en la variable $s. 

Como respuesta, Windows PowerShell ejecuta el comando en la sesión del equipo Server02.





Ejemplo 4

C:\PS>invoke-command -computername Server02 -scriptblock {$p = get-process powershell}

C:\PS> invoke-command -computername Server02 -scriptblock {$p.virtualmemorysize}
C:\PS>

C:\PS> $s = new-pssession -computername Server02
C:\PS> invoke-command -session $s -scriptblock {$p = get-process powershell}
C:\PS> invoke-command -session $s -scriptblock {$p.virtualmemorysize}
17930240

Descripción
-----------
En este ejemplo se comparan los efectos de utilizar los parámetros ComputerName y Session de Invoke-Command. Muestra la forma de utilizar una sesión para ejecutar una serie de comandos que comparten los mismos datos.

Los dos primeros comandos utilizan el parámetro ComputerName de Invoke-Command para ejecutar comandos en el equipo remoto Server02. El primer comando utiliza el comando Get-Process para obtener el proceso de PowerShell en el equipo remoto y guardarlo en la variable $p. El segundo comando obtiene el valor de la propiedad VirtualMemorySize del proceso de PowerShell. 

El primer comando se ejecuta correctamente. Sin embargo, el segundo no, porque al utilizar el parámetro ComputerName, Windows PowerShell crea una conexión solamente para ejecutar el comando. A continuación, cierra la conexión cuando se completa el comando. La variable $p se creó en una conexión, pero no existe en la conexión creada para el segundo comando.

El problema se resuelve creando una sesión (una conexión persistente) en el equipo remoto y ejecutando los dos comandos relacionados en la misma sesión.

El tercer comando usa el cmdlet New-PSSession para crear una sesión en el equipo Server02. A continuación, guarda la sesión en la variable $s. Los comandos cuarto y quinto repiten la serie de comandos utilizada en el primer conjunto, pero en este caso, el comando Invoke-Command utiliza el parámetro Session para ejecutar los dos comandos en la misma sesión. 

En este caso, dado que ambos comandos se ejecutan en la misma sesión, el comando se ejecuta correctamente y el valor de $p sigue estando activo en la sesión $s para uso posterior.





Ejemplo 5

C:\PS>$command = { get-eventlog -log "windows powershell" | where {$_.message -like "*certificate*"} }

C:\PS> invoke-command -computername S1, S2 -scriptblock $command

Descripción
-----------
En este ejemplo se muestra la forma de escribir un comando que se guarda en una variable local. 

Cuando el comando completo se guarda en una variable local, se puede especificar la variable como el valor del parámetro ScriptBlock. No es necesario utilizar la palabra clave "param" o la variable ArgumentList para enviar el valor de la variable local.

El primer comando guarda un comando Get-Eventlog en la variable $command. El formato del comando es el de un bloque de script.

El segundo comando usa el cmdlet Invoke-Command para ejecutar el comando en $command en los equipos remotos S1 y S2.





Ejemplo 6

C:\PS>invoke-command -computername server01, server02, TST-0143, localhost -configurationname MySession.PowerShell -scriptblock {get-eventlog "windows powershell"}

Descripción
-----------
En este ejemplo se muestra la forma de utilizar el cmdlet Invoke-Command para ejecutar un solo comando en varios equipos. 

El comando utiliza el parámetro ComputerName para especificar los equipos. Los nombres de equipo se presentan en una lista separada por comas. La lista de equipos incluye el valor "localhost", que representa el equipo local.

El comando utiliza el parámetro ConfigurationName para especificar una configuración de sesión alternativa para Windows PowerShell y el parámetro ScriptBlock para especificar el comando.

En este ejemplo, el comando del bloque de script obtiene los eventos del registro de eventos de Windows PowerShell en cada equipo remoto.





Ejemplo 7

C:\PS>$version = invoke-command -computername (get-content machines.txt) -scriptblock {(get-host).version}

Descripción
-----------
Este comando obtiene la versión del host de Windows PowerShell que se ejecuta en 200 equipos remotos. 

Dado que solamente se ejecuta un comando, no es necesario crear conexiones persistentes (sesiones) para cada uno de los equipos. En su lugar, el comando utiliza el parámetro ComputerName para indicar los equipos.

El comando utiliza el cmdlet Invoke-Command para ejecutar un comando Get-Host. Utiliza la notación de puntos para obtener la propiedad Version del host de Windows PowerShell.

Para especificar los equipos, utiliza el cmdlet Get-Content para obtener el contenido del archivo Machine.txt, un archivo de nombres de equipo.

Estos comandos se ejecutan de forma sincrónica (de uno en uno). Cuando los comandos se completan, los resultados de los comandos de todos los equipos se guardan en la variable $version. Los resultados incluyen el nombre del equipo en el que se originaron los datos.





Ejemplo 8

C:\PS>$s = new-pssession -computername Server01, Server02

C:\PS> invoke-command -session $s -scriptblock {get-eventlog system} -AsJob

Id   Name    State      HasMoreData   Location           Command
---  ----    -----      -----         -----------        --------             -------
1    Job1    Running    True          Server01,Server02  get-eventlog system


C:\PS> $j = Get-Job

C:\PS> $j | format-list -property *

HasMoreData   : True
StatusMessage :
Location      : Server01,Server02
Command       : get-eventlog system
JobStateInfo  : Running
Finished      : System.Threading.ManualResetEvent
InstanceId    : e124bb59-8cb2-498b-a0d2-2e07d4e030ca
Id            : 1
Name          : Job1
ChildJobs     : {Job2, Job3}
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}
StateChanged  :

C:\PS> $results = $j | Receive-Job

Descripción
-----------
Estos comandos ejecutan un trabajo en segundo plano en dos equipos remotos. Dado que el comando Invoke-Command utiliza el parámetro AsJob, los comandos se ejecutan en los equipos remotos, pero el trabajo reside en realidad en el equipo local y los resultados se transmiten al equipo local.

El primer comando utiliza el cmdlet New-PSSession para crear sesiones en los equipos remotos Server01 y Server02.

El segundo comando usa el cmdlet Invoke-Command para ejecutar un trabajo en segundo plano en cada una de las sesiones. El comando utiliza el parámetro AsJob para ejecutar el comando como un trabajo en segundo plano. Este comando devuelve un objeto de trabajo que contiene dos objetos de trabajo secundarios, uno para cada uno de los trabajos ejecutados en los dos equipos remotos.

El tercer comando usa un comando Get-Job para guardar el objeto de trabajo en la variable $j. 

El cuarto comando utiliza un operador de canalización (|) para enviar el valor de la variable $j al cmdlet Format-List, que muestra todas las propiedades del objeto de trabajo en una lista.

El quinto comando obtiene los resultados de los trabajos. Canaliza el objeto de trabajo contenido en $j al cmdlet Receive-Job y almacena los resultados en la variable $results.





Ejemplo 9

C:\PS>$MWFO-LOg = Microsoft-Windows-Forwarding/Operational

C:\PS> invoke-command -computername server01 -scriptblock {param($log, $num) get-eventlog -logname $log -newest $num} -ArgumentList $MWFO-log, 10

Descripción
-----------
En este ejemplo se muestra la forma de incluir los valores de las variables locales en un comando que se ejecuta en un equipo remoto.

El primer comando guarda el nombre del registro de eventos Microsoft-Windows-Forwarding/Operational en la variable $MWFO-Log.

El segundo comando usa el cmdlet Invoke-Command para ejecutar un comando Get-EventLog en el equipo remoto Server01 que obtiene los 10 eventos más recientes del registro de eventos Microsoft-Windows-Forwarding/Operational en Server01.

Este comando utiliza la palabra clave "param" para crear dos variables, $log y $num, que se utilizan como marcadores de posición en el comando Get-EventLog. Estos marcadores de posición tienen nombres arbitrarios que no necesitan coincidir con los nombres de las variables locales que proporcionan sus valores.

Los valores del parámetro ArgumentList muestran las dos maneras diferentes de especificar valores en la lista de argumentos. El valor del marcador de posición $log es la variable $MFWO-Log, que se define en el primer comando. El valor de la variable $num es 10.

Antes de que el comando se envíe al equipo remoto, las variables se reemplazan por los valores especificados.





Ejemplo 10

C:\PS>invoke-command -computername S1, S2 -scriptblock {get-process powershell} 

PSComputerName    Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   ProcessName
--------------    -------  ------    -----      ----- -----   ------     --   -----------
S1                575      15        45100      40988   200     4.68     1392 powershell
S2                777      14        35100      30988   150     3.68     67   powershell


C:\PS> invoke-command -computername S1, S2 -scriptblock {get-process powershell} -HideComputerName

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id   ProcessName
-------  ------    -----      ----- -----   ------     --   -----------
575      15        45100      40988   200     4.68     1392 powershell
777      14        35100      30988   150     3.68     67   powershell

Descripción
-----------
En este ejemplo se muestra el efecto de utilizar el parámetro HideComputerName de Invoke-Command. 

Los dos primeros comandos utilizan el cmdlet Invoke-Command para ejecutar un comando Get-Process para el proceso de PowerShell. Los resultados del primer comando incluyen la propiedad PsComputerName, que contiene el nombre del equipo en el que se ejecutó el comando. El resultado del segundo comando, que utiliza el parámetro HideComputerName, no incluye la columna PsComputerName.

El uso del parámetro HideComputerName no implica que cambie el objeto. Puede seguir usando los cmdlets Format para mostrar la propiedad PsComputerName de cualquiera de los objetos afectados.





Ejemplo 11

C:\PS>invoke-command -comp (get-content servers.txt) -filepath c:\scripts\sample.ps1 -argumentlist Process, Service

Descripción
-----------
En este ejemplo se utiliza el cmdlet Invoke-Command para ejecutar el script Sample.ps1 en todos los equipos enumerados en el archivo Servers.txt. El comando utiliza el parámetro FilePath para especificar el archivo de script. Este comando permite ejecutar el script en los equipos remotos, aunque el archivo de script no esté accesible a los equipos remotos.

Cuando se envía el comando, el contenido del archivo Sample.ps1 se copia en un bloque de script y el bloque de script se ejecuta en cada uno de los equipos remotos. Este procedimiento es equivalente a utilizar el parámetro ScriptBlock para enviar el contenido del script.





Ejemplo 12

C:\PS>$LiveCred = Get-Credential

C:\PS> Invoke-Command -ConfigurationName Microsoft.Exchange `
         -ConnectionUri https://ps.exchangelabs.com/powershell `
         -Credential $LiveCred  -Authentication Basic `
         -scriptblock {Invoke-Command {Set-Mailbox dan -DisplayName "Dan Park"}

Descripción
-----------
En este ejemplo se muestra la forma de ejecutar un comando en un equipo remoto que está identificado por un URI (dirección de Internet). En este ejemplo concreto se ejecuta un comando Set-Mailbox en un servidor Exchange remoto. El carácter de acento grave (`) en el comando es el carácter de continuación de Windows PowerShell.

El primer comando utiliza el cmdlet Get-Credential para almacenar las credenciales de identificador de Windows Live ID de la variable $LiveCred. Cuando el cuadro de diálogo de credenciales aparezca, escriba las credenciales de identificador de Windows Live.

El segundo comando usa el cmdlet Invoke-Command para ejecutar un comando Set-Mailbox. El comando utiliza el parámetro ConfigurationName para especificar que el comando se debe ejecutar en una sesión que utiliza la configuración de sesión Microsoft.Exchange. El parámetro ConnectionURI especifica la dirección URL del extremo de servidor Exchange. 

El parámetro de credencial especifica las credenciales de Windows Live almacenadas en la variable $LiveCred. El parámetro AuthenticationMechanism especifica el uso de la autenticación básica. El parámetro ScriptBlock especifica un bloque de script que contiene el comando.





Ejemplo 13

C:\PS>$max = New-PSSessionOption -MaximumRedirection 1

C:\PS> Invoke-Command -ConnectionUri https://ps.exchangelabs.com/powershell `
         -scriptblock {Invoke-Command {Get-Mailbox dan} `
         -AllowRedirection -SessionOption $max

Descripción
-----------
Este comando muestra cómo utilizar parámetros SessionOption y AllowRedirection para administrar la redirección de identificadores URI en un comando remoto.

El primer comando utiliza el cmdlet New-PSSessionOption para crear un objeto PSSessionOpption que guarda en la variable $max. El comando utiliza el parámetro MaximumRedirection para establecer en 1 la propiedad MaximumConnectionRedirectionCount del objeto PSSessionOption. 

El segundo comando usa el cmdlet Invoke-Command para ejecutar un comando Get-Mailbox en un servidor remoto donde se ejecuta Microsoft Exchange Server. El comando utiliza el parámetro AllowRedirection para proporcionar permiso explícito para redirigir la conexión a un extremo alternativo. También utiliza el parámetro SessionOption para especificar el objeto de sesión de la variable $max.

Como consecuencia, si el equipo remoto especificado por el parámetro ConnectionURI devuelve un mensaje de redirección, Windows PowerShell redirigirá la conexión, pero si el nuevo destino devuelve otro mensaje de redirección, se superará el valor de recuento de redirección 1 e Invoke-Command devolverá un error que no es de terminación.





Ejemplo 14

C:\PS>$so = New-PSSessionOption -SkipCACheck

PS C:\> invoke-command $s { get-hotfix } -SessionOption $so -credential server01\user01

Descripción
-----------
En este ejemplo se muestra la forma de crear y utilizar un parámetro SessionOption. 

El primer comando utiliza el cmdlet New-PSSessionOption para crear una opción de sesión. Guarda el objeto SessionOption resultante en el parámetro $so.

El segundo comando usa el cmdlet Invoke-Command para ejecutar un comando Get-Hotfix de forma remota. El valor del parámetro SessionOption es el objeto SessionOption en la variable $so.





Ejemplo 15

C:\PS>enable-wsmanCredSSP -delegate server02

C:\PS> connect-wsman Server02

C:\PS> set-item wsman:\server02*\service\auth\credSSP -value $true

C:\PS> $s = new-pssession server02

C:\PS> invoke-command -session $s -script {get-item \\Net03\Scripts\LogFiles.ps1} -authentication credssp -credential domain01\admin01

Descripción
-----------
En este ejemplo se muestra cómo tener acceso a un recurso compartido de red desde una sesión remota. 

El comando requiere que la delegación CredSSP esté habilitada en la configuración del cliente en el equipo local y en la configuración del servicio en el equipo remoto. Para ejecutar los comandos de este ejemplo, el usuario debe ser miembro del grupo Administradores en el equipo local y en el equipo remoto.

El primer comando utiliza el cmdlet Enable-WSManCredSSP para habilitar la delegación CredSSP desde el equipo local Server01 en el equipo remoto Server02. Con ello se establece la configuración del cliente de CredSSP en el equipo local.

El segundo comando usa el cmdlet Connect-WSman para conectarse al equipo Server02. Esta acción agrega un nodo para el equipo Server02 a la unidad WSMan: del equipo local; esto permite ver y cambiar la configuración de WS-Management en el equipo Server02.

El tercer comando utiliza el cmdlet Set-Item para cambiar a True el valor del elemento CredSSP en el nodo Service del equipo Server02. Esta acción habilita CredSSP en la configuración del servicio del equipo remoto.

El cuarto comando utiliza el cmdlet New-PSSession para crear una PSSession en el equipo Server02. Guarda la PSSession en la variable $s.

El quinto comando utiliza el cmdlet Invoke-Command para ejecutar un comando Get-Item en la sesión contenida en $s que obtiene un script desde el recurso compartido de red Net03\Scripts. El comando utiliza el parámetro Credential, y también el parámetro Authentication con el valor CredSSP.





Vea también

Conceptos

about_Remote
about_PSSessions
New-PSSession
Get-PSSession
Remove-PSSession
Enter-PSSession
Exit-PSSession
WSMan Provider