Invoke-Command
Ejecuta comandos en equipos locales y remotos.
Sintaxis
Invoke-Command
[-StrictMode <Version>]
[-ScriptBlock] <ScriptBlock>
[-NoNewScope]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-Session] <PSSession[]>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-FilePath] <String>
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-Session] <PSSession[]>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-ScriptBlock] <ScriptBlock>
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-ComputerName] <String[]>]
[-Credential <PSCredential>]
[-Port <Int32>]
[-UseSSL]
[-ConfigurationName <String>]
[-ApplicationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-InDisconnectedSession]
[-SessionName <String[]>]
[-HideComputerName]
[-JobName <String>]
[-FilePath] <String>
[-SessionOption <PSSessionOption>]
[-Authentication <AuthenticationMechanism>]
[-EnableNetworkAccess]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[[-ComputerName] <String[]>]
[-Credential <PSCredential>]
[-Port <Int32>]
[-UseSSL]
[-ConfigurationName <String>]
[-ApplicationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-InDisconnectedSession]
[-SessionName <String[]>]
[-HideComputerName]
[-JobName <String>]
[-ScriptBlock] <ScriptBlock>
[-SessionOption <PSSessionOption>]
[-Authentication <AuthenticationMechanism>]
[-EnableNetworkAccess]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-CertificateThumbprint <String>]
[<CommonParameters>]
Invoke-Command
[-Credential <PSCredential>]
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[[-ConnectionUri] <Uri[]>]
[-AsJob]
[-InDisconnectedSession]
[-HideComputerName]
[-JobName <String>]
[-ScriptBlock] <ScriptBlock>
[-AllowRedirection]
[-SessionOption <PSSessionOption>]
[-Authentication <AuthenticationMechanism>]
[-EnableNetworkAccess]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-CertificateThumbprint <String>]
[<CommonParameters>]
Invoke-Command
[-Credential <PSCredential>]
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[[-ConnectionUri] <Uri[]>]
[-AsJob]
[-InDisconnectedSession]
[-HideComputerName]
[-JobName <String>]
[-FilePath] <String>
[-AllowRedirection]
[-SessionOption <PSSessionOption>]
[-Authentication <AuthenticationMechanism>]
[-EnableNetworkAccess]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
-Credential <PSCredential>
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-ScriptBlock] <ScriptBlock>
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-VMId] <Guid[]>
[<CommonParameters>]
Invoke-Command
-Credential <PSCredential>
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-ScriptBlock] <ScriptBlock>
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
-VMName <String[]>
[<CommonParameters>]
Invoke-Command
-Credential <PSCredential>
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-FilePath] <String>
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[-VMId] <Guid[]>
[<CommonParameters>]
Invoke-Command
-Credential <PSCredential>
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-FilePath] <String>
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
-VMName <String[]>
[<CommonParameters>]
Invoke-Command
[-Port <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-ScriptBlock] <ScriptBlock>
-HostName <String[]>
[-UserName <String>]
[-KeyFilePath <String>]
[-Subsystem <String>]
[-ConnectingTimeout <Int32>]
[-SSHTransport]
[-Options <Hashtable>]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-ScriptBlock] <ScriptBlock>
[-RunAsAdministrator]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
-ContainerId <String[]>
[<CommonParameters>]
Invoke-Command
[-ConfigurationName <String>]
[-ThrottleLimit <Int32>]
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-FilePath] <String>
[-RunAsAdministrator]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
-ContainerId <String[]>
[<CommonParameters>]
Invoke-Command
[-AsJob]
[-HideComputerName]
[-JobName <String>]
[-ScriptBlock] <ScriptBlock>
-SSHConnection <Hashtable[]>
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-AsJob]
[-HideComputerName]
[-FilePath] <String>
-HostName <String[]>
[-UserName <String>]
[-KeyFilePath <String>]
[-Subsystem <String>]
[-ConnectingTimeout <Int32>]
[-SSHTransport]
[-Options <Hashtable>]
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Invoke-Command
[-AsJob]
[-HideComputerName]
[-FilePath] <String>
-SSHConnection <Hashtable[]>
[-RemoteDebug]
[-InputObject <PSObject>]
[-ArgumentList <Object[]>]
[<CommonParameters>]
Description
El Invoke-Command
cmdlet ejecuta comandos en un equipo local o remoto y devuelve todos los resultados de los comandos, incluidos los errores. Con un solo Invoke-Command
comando, puede ejecutar comandos en varios equipos.
Para ejecutar un único comando en un equipo remoto, use el parámetro ComputerName . Para ejecutar una serie de comandos relacionados que comparten datos, use el New-PSSession
cmdlet para crear una PSSession (una conexión persistente) en el equipo remoto y, a continuación, use el parámetro Session de Invoke-Command
para ejecutar el comando en PSSession. Para ejecutar un comando en una sesión desconectada, use el parámetro InDisconnectedSession . Para ejecutar un comando en un trabajo en segundo plano, use el parámetro AsJob .
También puede usar Invoke-Command
en un equipo local para ejecutar un bloque de script como un comando. PowerShell ejecuta el bloque de script inmediatamente en un ámbito secundario del ámbito actual.
Antes de usar Invoke-Command
para ejecutar comandos en un equipo remoto, lea about_Remote.
A partir de PowerShell 6.0, puede usar Secure Shell (SSH) para establecer una conexión a comandos e invocar comandos en equipos remotos. SSH debe instalarse en el equipo local y el equipo remoto debe configurarse con un punto de conexión SSH de PowerShell. La ventaja de una sesión remota de PowerShell basada en SSH es que funciona en varias plataformas (Windows, Linux, macOS). Para la sesión basada en SSH, use los parámetros HostName o SSHConnection para especificar el equipo remoto y la información de conexión pertinente. Para obtener más información sobre cómo configurar la comunicación remota ssh de PowerShell, consulte Comunicación remota de PowerShell a través de SSH.
Algunos ejemplos de código usan la expansión para reducir la longitud de la línea. Para obtener más información, consulte about_Splatting.
Ejemplos
Ejemplo 1: Ejecución de un script en un servidor
En este ejemplo se ejecuta el Test.ps1
script en el equipo Server01.
Invoke-Command -FilePath c:\scripts\test.ps1 -ComputerName Server01
El parámetro FilePath especifica un script que se encuentra en el equipo local. El script se ejecuta en el equipo remoto y los resultados se devuelven al equipo local.
Ejemplo 2: Ejecutar un comando en un servidor remoto
En este ejemplo se ejecuta un Get-Culture
comando en el equipo remoto Server01.
Invoke-Command -ComputerName Server01 -Credential Domain01\User01 -ScriptBlock {
Get-Culture
}
El parámetro ComputerName especifica el nombre del equipo remoto. El parámetro Credential se usa para ejecutar el comando en el contexto de seguridad de Domain01\User01, un usuario que tiene permiso para ejecutar comandos. El parámetro ScriptBlock especifica el comando que se va a ejecutar en el equipo remoto.
En respuesta, PowerShell solicita la contraseña y un método de autenticación para la cuenta User01. Después ejecuta el comando en el equipo Server01 y devuelve el resultado.
Ejemplo 3: Ejecutar un comando en una conexión persistente
En este ejemplo se ejecuta el mismo Get-Culture
comando en una sesión, mediante una conexión persistente, en el equipo remoto denominado Server02.
$s = New-PSSession -ComputerName Server02 -Credential Domain01\User01
Invoke-Command -Session $s -ScriptBlock { Get-Culture }
El New-PSSession
cmdlet crea una sesión en el equipo remoto Server02 y la guarda en la $s
variable . Normalmente, solo se crea una sesión cuando se ejecuta una serie de comandos en el equipo remoto.
El Invoke-Command
cmdlet ejecuta el Get-Culture
comando en Server02. El parámetro Session especifica la sesión guardada en la $s
variable .
En respuesta, PowerShell ejecuta el comando en la sesión en el equipo Server02.
Ejemplo 4: Usar una sesión para ejecutar una serie de comandos que comparten datos
En este ejemplo se comparan los efectos del uso de los parámetros ComputerName y Session de Invoke-Command
. Muestra cómo usar una sesión para ejecutar una serie de comandos que comparten los mismos datos.
Invoke-Command -ComputerName Server02 -ScriptBlock { $p = Get-Process PowerShell }
Invoke-Command -ComputerName Server02 -ScriptBlock { $p.VirtualMemorySize }
$s = New-PSSession -ComputerName Server02
Invoke-Command -Session $s -ScriptBlock { $p = Get-Process PowerShell }
Invoke-Command -Session $s -ScriptBlock { $p.VirtualMemorySize }
17930240
Los dos primeros comandos usan el parámetro ComputerName de Invoke-Command
para ejecutar comandos en el equipo remoto Server02. El primer comando usa el Get-Process
cmdlet para obtener el proceso de PowerShell en el equipo remoto y guardarlo en la $p
variable . El segundo comando obtiene el valor de la propiedad VirtualMemorySize del proceso de PowerShell.
Cuando se usa el parámetro ComputerName , PowerShell crea una nueva sesión para ejecutar el comando.
La sesión se cierra cuando se completa el comando. La $p
variable se creó en una conexión, pero no existe en la conexión creada para el segundo comando.
El problema se resuelve mediante la creación de una sesión persistente en el equipo remoto y, a continuación, la ejecución de ambos comandos en la misma sesión.
El New-PSSession
cmdlet crea una sesión persistente en el equipo Server02 y guarda la sesión en la $s
variable . Las Invoke-Command
líneas siguientes usan el parámetro Session para ejecutar ambos comandos en la misma sesión. Dado que ambos comandos se ejecutan en la misma sesión, el $p
valor permanece activo.
Ejemplo 5: Invocar un comando con un bloque de script almacenado en una variable
En este ejemplo se muestra cómo ejecutar un comando que se almacena como un bloque de script en una variable. Cuando el bloque de script se guarda en una variable, puede especificar la variable como el valor del parámetro ScriptBlock .
$command = {
Get-WinEvent -LogName PowerShellCore/Operational |
Where-Object -FilterScript { $_.Message -like '*certificate*' }
}
Invoke-Command -ComputerName S1, S2 -ScriptBlock $command
La $command
variable almacena el Get-WinEvent
comando con formato de bloque de script. Invoke-Command
ejecuta el comando almacenado en en $command
los equipos remotos S1 y S2.
Ejemplo 6: Ejecución de un único comando en varios equipos
En este ejemplo se muestra cómo usar Invoke-Command
para ejecutar un único comando en varios equipos.
$parameters = @{
ComputerName = 'Server01', 'Server02', 'TST-0143', 'localhost'
ConfigurationName = 'MySession.PowerShell'
ScriptBlock = { Get-WinEvent -LogName PowerShellCore/Operational }
}
Invoke-Command @parameters
El parámetro ComputerName especifica una lista separada por comas de nombres de equipo. La lista de equipos incluye el valor localhost, que representa el equipo local. El parámetro ConfigurationName especifica una configuración de sesión alternativa. El parámetro ScriptBlock se ejecuta Get-WinEvent
para obtener los registros de eventos de PowerShellCore/Operational de cada equipo.
Ejemplo 7: Obtener la versión del programa host en varios equipos
En este ejemplo se obtiene la versión del programa host de PowerShell que se ejecuta en 200 equipos remotos.
$version = Invoke-Command -ComputerName (Get-Content Machines.txt) -ScriptBlock {
(Get-Host).Version
}
Dado que solo se ejecuta un comando, no es necesario crear conexiones persistentes a cada uno de los equipos. En su lugar, el comando usa el parámetro ComputerName para indicar los equipos. Para especificar los equipos, usa el Get-Content
cmdlet para obtener el contenido del archivo Machine.txt, un archivo de nombres de equipo.
El Invoke-Command
cmdlet ejecuta un Get-Host
comando en los equipos remotos. Usa la notación de puntos para obtener la propiedad Version del host de PowerShell.
Estos comandos se ejecutan de uno en uno. Cuando se completan los comandos, la salida de los comandos de todos los equipos se guarda en la $version
variable . Los resultados incluyen el nombre del equipo en el que se originaron los datos.
Ejemplo 8: Ejecución de un trabajo en segundo plano en varios equipos remotos
En este ejemplo se ejecuta un comando en dos equipos remotos. El Invoke-Command
comando usa el parámetro AsJob para que el comando se ejecute como un trabajo en segundo plano. Los comandos se ejecutan en los equipos remotos, pero el trabajo existe en el equipo local. Los resultados se transmiten al equipo local.
$s = New-PSSession -ComputerName Server01, Server02
Invoke-Command -Session $s -ScriptBlock { Get-EventLog system } -AsJob
Id Name State HasMoreData Location Command
--- ---- ----- ----- ----------- ---------------
1 Job1 Running True Server01,Server02 Get-EventLog system
$j = Get-Job
$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 :
$results = $j | Receive-Job
El New-PSSession
cmdlet crea sesiones en los equipos remotos Server01 y Server02. El Invoke-Command
cmdlet ejecuta un trabajo en segundo plano en cada una de las sesiones. El comando usa 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 trabajo que se ejecuta en los dos equipos remotos.
El Get-Job
comando guarda el objeto de trabajo en la $j
variable . A $j
continuación, la variable se canaliza al Format-List
cmdlet para mostrar todas las propiedades del objeto de trabajo en una lista. El último comando obtiene los resultados de los trabajos. Canaliza el objeto de trabajo en $j
al Receive-Job
cmdlet y almacena los resultados en la $results
variable.
Ejemplo 9: Incluir variables locales en una ejecución de comandos en un equipo remoto
En este ejemplo se muestra cómo incluir los valores de las variables locales en un comando ejecutado en un equipo remoto. El comando usa el Using
modificador de ámbito para identificar una variable local en un comando remoto. De forma predeterminada, se supone que todas las variables están definidas en la sesión remota. El Using
modificador de ámbito se introdujo en PowerShell 3.0. Para obtener más información sobre el Using
modificador de ámbito, consulte about_Remote_Variables y about_Scopes.
$Log = 'PowerShellCore/Operational'
Invoke-Command -ComputerName Server01 -ScriptBlock {
Get-WinEvent -LogName $Using:Log -MaxEvents 10
}
La $Log
variable almacena el nombre del registro de eventos, PowerShellCore/Operational. El Invoke-Command
cmdlet se ejecuta Get-WinEvent
en Server01 para obtener los diez eventos más recientes del registro de eventos. El valor del parámetro LogName es la $Log
variable prefijo por el Using
modificador de ámbito para indicar que se creó en la sesión local, no en la sesión remota.
Ejemplo 10: Ocultar el nombre del equipo
En este ejemplo se muestra el efecto de usar el parámetro HideComputerName de Invoke-Command
.
HideComputerName no cambia el objeto que devuelve este cmdlet. Solo cambia la pantalla. Todavía puede usar los cmdlets Format para mostrar la propiedad PsComputerName de cualquiera de los objetos afectados.
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
Invoke-Command -ComputerName S1, S2 -HideComputerName -ScriptBlock {
Get-Process PowerShell
}
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
Los dos primeros comandos usan Invoke-Command
para ejecutar un Get-Process
comando para el proceso de PowerShell. La salida del primer comando incluye la propiedad PsComputerName , que contiene el nombre del equipo en el que se ejecutó el comando. La salida del segundo comando, que usa HideComputerName, no incluye la columna PsComputerName .
Ejemplo 11: Uso de la palabra clave Param en un bloque de script
La Param
palabra clave y el parámetro ArgumentList se usan para pasar valores de variable a parámetros con nombre en un bloque de script. En este ejemplo se muestran los nombres de archivo que comienzan por la letra a
y tienen la .pdf
extensión .
Para obtener más información sobre la Param
palabra clave , consulte about_Language_Keywords.
$parameters = @{
ComputerName = 'Server01'
ScriptBlock = {
Param ($param1, $param2)
Get-ChildItem -Name $param1 -Include $param2
}
ArgumentList = 'a*', '*.pdf'
}
Invoke-Command @parameters
aa.pdf
ab.pdf
ac.pdf
az.pdf
Invoke-Command
usa el parámetro ScriptBlock que define dos variables y $param1
$param2
. Get-ChildItem
usa los parámetros con nombre, Name e Include con los nombres de variable. ArgumentList pasa los valores a las variables.
Ejemplo 12: Uso de la variable automática $args en un bloque de script
La $args
variable automática y el parámetro ArgumentList se usan para pasar valores de matriz a posiciones de parámetro en un bloque de script. En este ejemplo se muestra el contenido del directorio de un servidor de .txt
archivos. El Get-ChildItem
parámetro Path es la posición 0 y el parámetro Filter es la posición 1.
Para obtener más información sobre la $args
variable, consulte about_Automatic_Variables
$parameters = @{
ComputerName = 'Server01'
ScriptBlock = { Get-ChildItem $args[0] $args[1] }
ArgumentList = 'C:\Test', '*.txt*'
}
Invoke-Command @parameters
Directory: C:\Test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 6/12/2019 15:15 128 alog.txt
-a--- 7/27/2019 15:16 256 blog.txt
-a--- 9/28/2019 17:10 64 zlog.txt
Invoke-Command
usa un parámetro ScriptBlock y Get-ChildItem
especifica los valores de matriz $args[0]
y $args[1]
. ArgumentList pasa los valores de $args
matriz a las posiciones de Get-ChildItem
parámetro para Path y Filter.
Ejemplo 13: Ejecutar un script en todos los equipos enumerados en un archivo de texto
En este ejemplo se usa el Invoke-Command
cmdlet para ejecutar el Sample.ps1
script en todos los equipos enumerados en el Servers.txt
archivo. El comando usa el parámetro FilePath para especificar el archivo de script. Este comando le permite ejecutar el script en los equipos remotos, incluso si el archivo de script no es accesible para los equipos remotos.
$parameters = @{
ComputerName = (Get-Content Servers.txt)
FilePath = 'C:\Scripts\Sample.ps1'
ArgumentList = 'Process', 'Service'
}
Invoke-Command @parameters
Al enviar el comando, el contenido del Sample.ps1
archivo 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 al uso del parámetro ScriptBlock para enviar el contenido del script.
Ejemplo 14: Ejecución de un comando en un equipo remoto mediante un URI
En este ejemplo se muestra cómo ejecutar un comando en un equipo remoto identificado por un identificador uniforme de recursos (URI). En este ejemplo concreto se ejecuta un Set-Mailbox
comando en un servidor remoto de Exchange.
$LiveCred = Get-Credential
$parameters = @{
ConfigurationName = 'Microsoft.Exchange'
ConnectionUri = 'https://ps.exchangelabs.com/PowerShell'
Credential = $LiveCred
Authentication = 'Basic'
ScriptBlock = { Set-Mailbox Dan -DisplayName 'Dan Park' }
}
Invoke-Command @parameters
La primera línea usa el Get-Credential
cmdlet para almacenar las credenciales de Windows Live ID en la $LiveCred
variable . PowerShell solicita al usuario que escriba las credenciales de Windows Live ID.
La $parameters
variable es una tabla hash que contiene los parámetros que se van a pasar al Invoke-Command
cmdlet . El Invoke-Command
cmdlet ejecuta un Set-Mailbox
comando mediante la configuración de sesión de Microsoft.Exchange . El parámetro ConnectionURI especifica la dirección URL del punto de conexión del servidor Exchange. El parámetro Credential especifica las credenciales almacenadas en la $LiveCred
variable . 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 15: Usar una opción de sesión
En este ejemplo se muestra cómo crear y usar un parámetro SessionOption .
$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$parameters = @{
ComputerName = 'server01'
UseSSL = $true
ScriptBlock = { Get-HotFix }
SessionOption = $so
Credential = 'server01\user01'
}
Invoke-Command @parameters
El New-PSSessionOption
cmdlet crea un objeto de opción de sesión que hace que el extremo remoto no compruebe la entidad de certificación, el nombre canónico y las listas de revocación al evaluar la conexión HTTPS entrante. El objeto SessionOption se guarda en la $so
variable .
Nota:
Deshabilitar estas comprobaciones es conveniente para solucionar problemas, pero obviamente no es seguro.
El Invoke-Command
cmdlet ejecuta un Get-HotFix
comando de forma remota. El parámetro SessionOption recibe la $so
variable .
Ejemplo 16: Administración del redireccionamiento de URI en un comando remoto
En este ejemplo se muestra cómo usar los parámetros AllowRedirection y SessionOption para administrar el redireccionamiento de URI en un comando remoto.
$max = New-PSSessionOption -MaximumRedirection 1
$parameters = @{
ConnectionUri = 'https://ps.exchangelabs.com/PowerShell'
ScriptBlock = { Get-Mailbox dan }
AllowRedirection = $true
SessionOption = $max
}
Invoke-Command @parameters
El New-PSSessionOption
cmdlet crea un objeto PSSessionOption que se guarda en la $max
variable . El comando usa el parámetro MaximumRedirection para establecer la propiedad MaximumConnectionRedirectionCount del objeto PSSessionOption en 1.
El Invoke-Command
cmdlet ejecuta un Get-Mailbox
comando en un servidor remoto de Microsoft Exchange Server. El parámetro AllowRedirection proporciona permiso explícito para redirigir la conexión a un punto de conexión alternativo. El parámetro SessionOption usa el objeto de sesión almacenado en la $max
variable .
Como resultado, si el equipo remoto especificado por ConnectionURI devuelve un mensaje de redirección, PowerShell redirige la conexión, pero si el nuevo destino devuelve otro mensaje de redirección, se supera el valor de recuento de redirección de 1 y Invoke-Command
devuelve un error de no terminación.
Ejemplo 17: Acceso a un recurso compartido de red en una sesión remota
En este ejemplo se muestra cómo acceder a un recurso compartido de red desde una sesión remota. Se usan tres equipos para mostrar el ejemplo. Server01 es el equipo local, Server02 es el equipo remoto y Net03 contiene el recurso compartido de red. Server01 se conecta a Server02 y, a continuación, Server02 realiza un segundo salto a Net03 para acceder al recurso compartido de red. Para obtener más información sobre cómo la comunicación remota de PowerShell admite saltos entre equipos, consulte Realización del segundo salto en comunicación remota de PowerShell.
La delegación necesaria del proveedor de soporte técnico de seguridad de credenciales (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, debe ser miembro del grupo Administradores en el equipo local y el equipo remoto.
Enable-WSManCredSSP -Role Client -DelegateComputer Server02
$s = New-PSSession Server02
Invoke-Command -Session $s -ScriptBlock { Enable-WSManCredSSP -Role Server -Force }
$parameters = @{
ComputerName = 'Server02'
ScriptBlock = { Get-Item \\Net03\Scripts\LogFiles.ps1 }
Authentication = 'CredSSP'
Credential = 'Domain01\Admin01'
}
Invoke-Command @parameters
El Enable-WSManCredSSP
cmdlet habilita la delegación credSSP desde el equipo local Server01 al equipo remoto Server02. El parámetro Role especifica Client para configurar el valor de cliente CredSSP en el equipo local.
New-PSSession
crea un objeto PSSession para Server02 y almacena el objeto en la $s
variable .
El Invoke-Command
cmdlet usa la $s
variable para conectarse al equipo remoto, Server02. El parámetro ScriptBlock se ejecuta Enable-WSManCredSSP
en el equipo remoto. El parámetro Role especifica Server para configurar el valor del servidor CredSSP en el equipo remoto.
La $parameters
variable contiene los valores de parámetro para conectarse al recurso compartido de red. El Invoke-Command
cmdlet ejecuta un Get-Item
comando en la sesión de $s
. Este comando obtiene un script del \\Net03\Scripts
recurso compartido de red. El comando usa el parámetro Authentication con un valor de CredSSP y el parámetro Credential con un valor de Domain01\Admin01.
Ejemplo 18: Inicio de scripts en muchos equipos remotos
En este ejemplo se ejecuta un script en más de cien equipos. Para minimizar el impacto en el equipo local, se conecta a cada equipo, inicia el script y luego se desconecta. El script se sigue ejecutando en las sesiones desconectadas.
$parameters = @{
ComputerName = (Get-Content -Path C:\Test\Servers.txt)
InDisconnectedSession = $true
FilePath = '\\Scripts\Public\ConfigInventory.ps1'
SessionOption = @{
OutputBufferingMode = 'Drop'
IdleTimeout = [timespan]::FromHours(12)
}
}
Invoke-Command @parameters
El comando usa Invoke-Command
para ejecutar el script. El valor del parámetro ComputerName es un Get-Content
comando que obtiene los nombres de los equipos remotos de un archivo de texto. El parámetro InDisconnectedSession desconecta las sesiones en cuanto inicia el comando. El valor del parámetro FilePath es el script que Invoke-Command
se ejecuta en cada equipo.
El valor de SessionOption es una tabla hash. El valor OutputBufferingMode se establece en Drop
y el valor IdleTimeout se establece en 12 horas.
Para obtener los resultados de comandos y scripts que se ejecutan en sesiones desconectadas, use el Receive-PSSession
cmdlet .
Ejemplo 19: Ejecución de un comando en un equipo remoto mediante SSH
En este ejemplo se muestra cómo ejecutar un comando en un equipo remoto mediante Secure Shell (SSH). Si SSH está configurado en el equipo remoto para solicitar contraseñas, recibirá un mensaje de contraseña. De lo contrario, tendrá que usar la autenticación de usuario basada en claves SSH.
Invoke-Command -HostName UserA@LinuxServer01 -ScriptBlock { Get-MailBox * }
Ejemplo 20: Ejecutar un comando en un equipo remoto mediante SSH y especificar una clave de autenticación de usuario
En este ejemplo se muestra cómo ejecutar un comando en un equipo remoto mediante SSH y especificar un archivo de clave para la autenticación de usuario. No se le pedirá una contraseña a menos que se produzca un error en la autenticación de claves y el equipo remoto esté configurado para permitir la autenticación de contraseña básica.
$parameters = @{
HostName = 'UserA@LinuxServer01'
ScriptBlock = { Get-MailBox * }
KeyFilePath = '/UserA/UserAKey_rsa'
}
Invoke-Command
Ejemplo 21: Ejecución de un archivo de script en varios equipos remotos mediante SSH como trabajo
En este ejemplo se muestra cómo ejecutar un archivo de script en varios equipos remotos mediante SSH y el conjunto de parámetros SSHConnection . El parámetro SSHConnection toma una matriz de tablas hash que contienen información de conexión para cada equipo. En este ejemplo se requiere que los equipos remotos de destino tengan SSH configurado para admitir la autenticación de usuario basada en claves.
$sshConnections = @(
@{
HostName = "WinServer1"
UserName = "Domain\UserA"
KeyFilePath = "C:\Users\UserA\id_rsa"
}
@{
HostName = "UserB@LinuxServer5"
KeyFilePath = "/Users/UserB/id_rsa"
}
)
$results = Invoke-Command -FilePath c:\Scripts\GetInfo.ps1 -SSHConnection $sshConnections
Ejemplo 22: Conexión a una sesión de SSH remota mediante opciones de SSH
En este ejemplo se muestra cómo ejecutar un archivo de script en una máquina remota basada en Linux mediante opciones ssh. El parámetro Options toma una tabla hash de valores que se pasan como opciones al comando subyacente ssh
el establecido la conexión al sistema remoto.
$options = @{
Port=22
User = 'UserB'
Host = 'LinuxServer5'
}
$results = Invoke-Command -FilePath c:\Scripts\CollectEvents.ps1 -KeyFilePath '/Users/UserB/id_rsa' -Options $options
Parámetros
-AllowRedirection
Permite redirigir esta conexión a un identificador uniforme de recursos alternativo (URI).
Cuando se usa el parámetro ConnectionURI , el destino remoto puede devolver una instrucción para redirigir a otro URI. De forma predeterminada, PowerShell no redirige las conexiones, pero puede usar este parámetro para permitir que redirija la conexión.
También puede limitar el número de veces que se redirige la conexión cambiando el valor de la opción de sesión MaximumConnectionRedirectionCount . Use el parámetro MaximumRedirection del New-PSSessionOption
cmdlet o establezca la propiedad MaximumConnectionRedirectionCount de la $PSSessionOption
variable de preferencia. El valor predeterminado es 5.
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-ApplicationName
Escriba el segmento del nombre de aplicación del URI de conexión. Use este parámetro para especificar el nombre de la aplicación cuando no use el parámetro ConnectionURI en el comando .
El valor predeterminado es el valor de la $PSSessionApplicationName
variable de preferencia 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, consulte about_Preference_Variables.
El servicio WinRM usa el nombre de aplicación para seleccionar un agente de escucha que atienda 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.
Tipo: | String |
Posición: | Named |
Valor predeterminado: | $PSSessionApplicationName if set on the local computer, otherwise WSMAN |
Requerido: | False |
Aceptar entrada de canalización: | True |
Aceptar caracteres comodín: | False |
-ArgumentList
Proporciona los valores de los parámetros para el scriptblock. Los parámetros del bloque de script se pasan por posición del valor de matriz proporcionado a ArgumentList. Esto se conoce como expansión de matriz. Para obtener más información sobre el comportamiento de ArgumentList, vea about_Splatting.
Tipo: | Object[] |
Alias: | Args |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-AsJob
Indica que este cmdlet 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 finalizar.
Cuando se usa el parámetro 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 finaliza el trabajo. Para administrar el trabajo, use los *-Job
cmdlets. Para obtener los resultados del trabajo, use el Receive-Job
cmdlet .
El parámetro AsJob es similar al uso del Invoke-Command
cmdlet para ejecutar un Start-Job
cmdlet de forma remota. Sin embargo, con AsJob, el trabajo se crea en el equipo local, aunque el trabajo se ejecute en un equipo remoto. Los resultados del trabajo remoto se devuelven automáticamente al equipo local.
Para obtener más información sobre los trabajos en segundo plano de PowerShell, consulte about_Jobs y about_Remote_Jobs.
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Authentication
Especifica el mecanismo que se usa para autenticar las credenciales del usuario. La autenticación CredSSP solo está disponible en Windows Vista, Windows Server 2008 y versiones posteriores del sistema operativo Windows.
Los valores aceptables para este parámetro son los siguientes:
- Valor predeterminado
- Básico
- Credssp
- Digest
- Kerberos
- Negotiate
- NegotiateWithImplicitCredential
El valor predeterminado es Default.
Para obtener más información sobre los valores de este parámetro, vea AuthenticationMechanism (enumeración).
Precaución
La autenticación del proveedor de soporte técnico de seguridad de credenciales (CredSSP), en la que las credenciales del usuario se pasan a un equipo remoto para autenticarse, está diseñada para comandos que requieren autenticación en más de un recurso, como el acceso a un recurso compartido de red remoto. Este mecanismo el riesgo de seguridad de la operación remota. Si el equipo remoto se ve comprometido, las credenciales que se pasen a él se pueden utilizar para controlar la sesión de red. Para obtener más información, consulte Proveedor de compatibilidad con seguridad de credenciales.
Tipo: | AuthenticationMechanism |
Valores aceptados: | Basic, Default, Credssp, Digest, Kerberos, Negotiate, NegotiateWithImplicitCredential |
Posición: | Named |
Valor predeterminado: | Default |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-CertificateThumbprint
Especifica el certificado de clave pública digital (X509) de una cuenta de usuario que tiene permiso para conectarse a la sesión desconectada. Escriba la huella digital del certificado.
Los certificados se usan para la autenticación basada en certificados de cliente. Solo se pueden asignar a cuentas de usuario locales y no funcionan con cuentas de dominio.
Para obtener una huella digital de certificado, use un Get-Item
comando o Get-ChildItem
en la unidad Cert: de PowerShell.
Tipo: | String |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-ComputerName
Especifica los equipos en los que se ejecuta el comando. La opción predeterminada es el equipo local.
Cuando se usa el parámetro ComputerName , PowerShell crea una conexión temporal que solo se usa para ejecutar el comando especificado y, a continuación, se cierra. Si necesita una conexión persistente, use 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 separada por comas. Para especificar el equipo local, escriba el nombre del equipo, localhost o un punto (.
).
Para usar una dirección IP en el valor de ComputerName, el comando debe incluir el parámetro Credential . El equipo debe configurarse para el transporte HTTPS o la dirección IP del equipo remoto debe incluirse en la lista de Host de confianza de WinRM del equipo local. Para obtener instrucciones para agregar un nombre de equipo a la lista TrustedHosts , vea How to Add a Computer to the Trusted Host List.
En Windows Vista y versiones posteriores del sistema operativo Windows, para incluir el equipo local en el valor de ComputerName, debe ejecutar PowerShell mediante la opción Ejecutar como administrador .
Tipo: | String[] |
Alias: | Cn |
Posición: | 0 |
Valor predeterminado: | Local computer |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-ConfigurationName
Especifica la configuración de sesión que se usa para la nueva PSSession.
Escriba un nombre de configuración o el URI de un recurso completo para configurar una sesión. Si especifica solo el nombre de configuración, se antepone el siguiente URI de esquema: http://schemas.microsoft.com/PowerShell
.
Cuando se usa con SSH, este parámetro especifica el subsistema que se va a usar en el destino tal como se define en sshd_config
. El valor predeterminado de SSH es el powershell
subsistema.
La configuración de sesión para una sesión se encuentra en el equipo remoto. Si la configuración de sesión especificada no existe en el equipo remoto, se produce un error en el comando.
El valor predeterminado es el valor de la $PSSessionConfigurationName
variable de preferencia en el equipo local. Si no se establece esta variable de preferencia, el valor predeterminado es Microsoft.PowerShell. Para obtener más información, consulte about_Preference_Variables.
Tipo: | String |
Posición: | Named |
Valor predeterminado: | $PSSessionConfigurationName if set on the local computer, otherwise Microsoft.PowerShell |
Requerido: | False |
Aceptar entrada de canalización: | True |
Aceptar caracteres comodín: | False |
-ConnectingTimeout
Especifica la cantidad de tiempo en milisegundos permitidos para que se complete la conexión SSH inicial. Si la conexión no se completa en el tiempo especificado, se devuelve un error.
Este parámetro se introdujo en PowerShell 7.2
Tipo: | Int32 |
Posición: | Named |
Valor predeterminado: | Unlimited |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-ConnectionUri
Especifica un identificador uniforme de recursos (URI) que define el extremo de la conexión de la sesión. El identificador URI debe ser completo.
El formato de esta cadena es:
<Transport>://<ComputerName>:<Port>/<ApplicationName>
El valor predeterminado es el siguiente:
http://localhost:5985/WSMAN
Si no especifica un URI de conexión, puede usar los parámetros UseSSL y Port para especificar los valores de URI de conexión.
Los valores válidos para el segmento Transporte del URI son HTTP y HTTPS. Si especifica un URI de conexión con un segmento de transporte, pero no especifica un puerto, la sesión se crea con los puertos de estándares: 80 para HTTP y 443 para HTTPS. Para usar los puertos predeterminados para la comunicación remota de PowerShell, especifique el puerto 5985 para HTTP o 5986 para HTTPS.
Si el equipo de destino redirige la conexión a un URI diferente, PowerShell impide el redireccionamiento a menos que use el parámetro AllowRedirection en el comando.
Tipo: | Uri[] |
Alias: | URI, CU |
Posición: | 0 |
Valor predeterminado: | http://localhost:5985/WSMAN |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-ContainerId
Especifica una matriz de identificadores de contenedor.
Tipo: | String[] |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | True |
Aceptar caracteres comodín: | False |
-Credential
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 User01 o Domain01\User01, o escriba un objeto PSCredential generado por el Get-Credential
cmdlet . Si escribe un nombre de usuario, se le pedirá que escriba la contraseña.
Las credenciales se almacenan en un objeto PSCredential y la contraseña se almacena como SecureString.
Nota:
Para obtener más información sobre la protección de datos SecureString , consulte ¿Cómo es secure is SecureString?.
Tipo: | PSCredential |
Posición: | Named |
Valor predeterminado: | Current user |
Requerido: | False |
Aceptar entrada de canalización: | True |
Aceptar caracteres comodín: | False |
-EnableNetworkAccess
Indica que este cmdlet agrega un token de seguridad interactivo a las sesiones de bucle invertido. El token interactivo permite ejecutar comandos en la sesión de bucle invertido que obtienen datos de otros equipos. Por ejemplo, se puede ejecutar un comando en la sesión que copie los archivos XML de un equipo remoto al equipo local.
Una sesión de bucle invertido es una PSSession que se origina y termina en el mismo equipo. Para crear una sesión de bucle invertido, omita el parámetro ComputerName o establezca su valor en dot (.
), localhost o el nombre del equipo local.
De forma predeterminada, las sesiones de bucle invertido se crean mediante un token de red, lo que podría no proporcionar permiso suficiente para autenticarse en equipos remotos.
El parámetro EnableNetworkAccess solo es efectivo en sesiones de bucle invertido. Si usa EnableNetworkAccess al crear una sesión en un equipo remoto, el comando se realiza correctamente, pero el parámetro se omite.
Puede permitir el acceso remoto en una sesión de bucle invertido mediante el valor CredSSP del parámetro Authentication , que delega las credenciales de sesión en otros equipos.
Para proteger el equipo contra el acceso malintencionado, las sesiones de bucle invertido desconectadas que tienen tokens interactivos, que son los creados mediante EnableNetworkAccess, solo se pueden volver a conectar desde el equipo en el que se creó la sesión. Las sesiones desconectadas que usan la autenticación CredSSP se pueden volver a conectar desde otros equipos. Para obtener más información, vea Disconnect-PSSession
.
Este parámetro se introdujo en PowerShell 3.0.
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-FilePath
Especifica un script local que este cmdlet se ejecuta 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 existir en el equipo local o en un directorio al que pueda acceder el equipo local. Use ArgumentList para especificar los valores de los parámetros en el script.
Cuando se usa este parámetro, 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.
Tipo: | String |
Alias: | PSPath |
Posición: | 1 |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-HideComputerName
Indica que este cmdlet omite el nombre de equipo de cada objeto de la presentación de salida. De forma predeterminada, el nombre de equipo que generó el objeto aparece en la pantalla.
Este parámetro afecta únicamente a los resultados mostrados. No cambia el objeto.
Tipo: | SwitchParameter |
Alias: | HCN |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-HostName
Especifica una matriz de nombres de equipo para una conexión basada en Secure Shell (SSH). Esto es similar al parámetro ComputerName , excepto que la conexión al equipo remoto se realiza mediante SSH en lugar de Windows WinRM.
Este parámetro se introdujo en PowerShell 6.0.
Tipo: | String[] |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-InDisconnectedSession
Indica que este cmdlet ejecuta un comando o script en una sesión desconectada.
Cuando se usa el parámetro InDisconnectedSession , Invoke-Command
se crea una sesión persistente en cada equipo remoto, se inicia el comando especificado por el parámetro ScriptBlock o FilePath y, a continuación, se desconecta de la sesión. Los comandos continúan ejecutándose en las sesiones desconectadas. InDisconnectedSession permite ejecutar comandos sin mantener una conexión a las sesiones remotas. Además, dado que la sesión está desconectada antes de que se devuelvan los resultados, InDisconnectedSession garantiza que todos los resultados del comando se devuelvan a la sesión reconectada, en lugar de dividirse entre sesiones.
No se puede usar InDisconnectedSession con el parámetro Session o el parámetro AsJob.
Los comandos que usan InDisconnectedSession devuelven un objeto PSSession que representa la sesión desconectada. No devuelven la salida del comando. Para conectarse a la sesión desconectada, use los Connect-PSSession
cmdlets o Receive-PSSession
. Para obtener los resultados de los comandos que se ejecutaron en la sesión, use el Receive-PSSession
cmdlet . Para ejecutar comandos que generan la salida en una sesión desconectada, establezca el valor de la opción de sesión OutputBufferingMode en Quitar. Si piensa conectarse a la sesión desconectada, establezca el tiempo de espera de inactividad en la sesión para que proporcione tiempo suficiente para conectarse antes de eliminar la sesión.
Puede establecer el modo de almacenamiento en búfer de salida y el tiempo de espera de inactividad en el parámetro SessionOption o en la variable de $PSSessionOption
preferencia. Para obtener más información sobre las opciones de sesión, consulte New-PSSessionOption
y about_Preference_Variables.
Para obtener más información sobre la característica Sesiones desconectadas, consulte about_Remote_Disconnected_Sessions.
Este parámetro se introdujo en PowerShell 3.0.
Tipo: | SwitchParameter |
Alias: | Disconnected |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-InputObject
Especifica entradas del comando. Especifique una variable que contenga los objetos, o escriba un comando o una expresión que obtenga los objetos.
Al usar el parámetro InputObject , use la $Input
variable automática en el valor del parámetro ScriptBlock para representar los objetos de entrada.
Tipo: | PSObject |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | True |
Aceptar caracteres comodín: | False |
-JobName
Especifica un nombre descriptivo para el trabajo en segundo plano. De forma predeterminada, los trabajos se denominan Job<n>
, donde <n>
es un número ordinal.
Si usa el parámetro JobName en un comando, el comando se ejecuta como un trabajo y Invoke-Command
devuelve un objeto de trabajo, aunque no incluya AsJob en el comando.
Para obtener más información sobre los trabajos en segundo plano de PowerShell, consulte about_Jobs.
Tipo: | String |
Posición: | Named |
Valor predeterminado: | Job<n> |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-KeyFilePath
Especifica una ruta de acceso de archivo de clave usada por Secure Shell (SSH) para autenticar a un usuario en un equipo remoto.
SSH permite realizar la autenticación de usuario a través de claves públicas y privadas como alternativa a la autenticación de contraseña básica. Si el equipo remoto está configurado para la autenticación de claves, este parámetro se puede usar para proporcionar la clave que identifica al usuario.
Este parámetro se introdujo en PowerShell 6.0.
Tipo: | String |
Alias: | IdentityFilePath |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-NoNewScope
Indica que este cmdlet ejecuta el comando especificado en el ámbito actual. De forma predeterminada, Invoke-Command
ejecuta comandos en su propio ámbito.
Este parámetro solo es válido en los comandos que se ejecutan en la sesión actual, es decir, los comandos que omiten los parámetros ComputerName y Session .
Este parámetro se introdujo en PowerShell 3.0.
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Options
Especifica una tabla hash de las opciones ssh que se usan al conectarse a una sesión remota basada en SSH. Las opciones posibles son los valores admitidos por la versión basada en Unix del comando ssh .
Los valores pasados explícitamente por parámetros tienen prioridad sobre los valores pasados en la tabla hash Options . Por ejemplo, el uso del parámetro Port invalida cualquier Port
par clave-valor pasado en la tabla hash Options.
Este parámetro se agregó en PowerShell 7.3.
Tipo: | Hashtable |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Port
Especifica el puerto de red en el equipo remoto que se usa para este comando. Para conectarse a un equipo remoto, este debe estar escuchando en el puerto que usa la conexión. Los puertos predeterminados son 5985 (puerto WinRM para HTTP) y 5986 (puerto WinRM para HTTPS).
Antes de usar un puerto alternativo, configure el agente de 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 PowerShell:
Remove-Item -Path WSMan:\Localhost\listener\listener* -Recurse
New-Item -Path WSMan:\Localhost\listener -Transport http -Address * -Port \<port-number\>
No use el parámetro Port a menos que sea necesario. El puerto que se establece en el comando se aplica a todos los equipos o sesiones en que dicho comando se ejecuta. Una configuración de puerto alternativo podría impedir que el comando se ejecutara en todos los equipos.
Tipo: | Int32 |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-RemoteDebug
Se usa para ejecutar el comando invocado en modo de depuración en la sesión remota de PowerShell.
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-RunAsAdministrator
Indica que este cmdlet invoca un comando como administrador.
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-ScriptBlock
Especifica los comandos que se van a ejecutar. Incluya los comandos entre llaves ({ }
) para crear un bloque de script. Cuando se usa Invoke-Command
para ejecutar un comando de forma remota, las variables del comando se evalúan en el equipo remoto.
Nota:
Los parámetros del scriptblock solo se pueden pasar desde ArgumentList por posición. Los parámetros switch no se pueden pasar por posición. Si necesita un parámetro que se comporte como un tipo SwitchParameter , use un tipo booleano en su lugar.
Tipo: | ScriptBlock |
Alias: | Command |
Posición: | 0 |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Session
Especifica una matriz de sesiones en las que este cmdlet ejecuta el comando . Escriba una variable que contenga objetos PSSession o un comando que cree o obtenga los objetos PSSession , como un New-PSSession
comando o Get-PSSession
.
Al crear una PSSession, PowerShell establece una conexión persistente al equipo remoto. Use una PSSession para ejecutar una serie de comandos relacionados que comparten datos. Para ejecutar un único comando o una serie de comandos no relacionados, use el parámetro ComputerName . Para obtener más información, consulte about_PSSessions.
Tipo: | PSSession[] |
Posición: | 0 |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-SessionName
Especifica un nombre descriptivo para una sesión desconectada. Puede usar el nombre para hacer referencia a la sesión en comandos posteriores, como un Get-PSSession
comando. Este parámetro solo es válido con el parámetro InDisconnectedSession .
Este parámetro se introdujo en PowerShell 3.0.
Tipo: | String[] |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-SessionOption
Especifica opciones avanzadas para la sesión. Escriba un objeto SessionOption , como uno que cree mediante el New-PSSessionOption
cmdlet o una tabla hash en la que las claves son nombres de opción de sesión y los valores son valores de opción de sesión.
Nota:
Si especifica una tabla hash para SessionOption, PowerShell convierte la tabla hash en un objeto System.Management.Autiomation.Remoting.PSSessionOption . Los valores de las claves especificadas en la tabla hash se convierten en la propiedad coincidente del objeto . Esto se comporta de forma diferente a la llamada a New-PSSessionOption
. Por ejemplo, los valores System.TimeSpan de las propiedades de tiempo de espera, como IdleTimeout, convierten un valor entero en tics en lugar de milisegundos.
Para obtener más información sobre el objeto PSSessionOption y sus propiedades, consulte PSSessionOption.
Los valores predeterminados de las opciones se determinan mediante el valor de la $PSSessionOption
variable de preferencia, si se establece. De lo contrario, los valores predeterminados se establecerán mediante las opciones establecidas en la configuración de sesión.
Los valores de opción de sesión tienen prioridad sobre los valores predeterminados de las sesiones establecidas en la $PSSessionOption
variable de preferencia y en la configuración de la sesión. Sin embargo, no tienen prioridad sobre los valores máximos, cuotas o límites establecidos en la configuración de sesión.
Para obtener una descripción de las opciones de sesión que incluye los valores predeterminados, consulte New-PSSessionOption
. Para obtener información sobre la $PSSessionOption
variable de preferencia, consulte about_Preference_Variables. Para más información sobre las configuraciones de sesión, vea about_Session_Configurations.
Tipo: | PSSessionOption |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-SSHConnection
Este parámetro toma una matriz de tablas hash donde cada tabla hash contiene uno o varios parámetros de conexión necesarios para establecer una conexión de Secure Shell (SSH). El parámetro SSHConnection es útil para crear varias sesiones en las que cada sesión requiere información de conexión diferente.
La tabla hash tiene los siguientes miembros:
- NombreDeEquipo (o Nombre de host)
- Puerto
- UserName
- KeyFilePath (o IdentityFilePath)
ComputerName (o HostName) es el único par clave-valor necesario.
Este parámetro se introdujo en PowerShell 6.0.
Tipo: | Hashtable[] |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-SSHTransport
Indica que la conexión remota se establece mediante Secure Shell (SSH).
De forma predeterminada, PowerShell usa Windows WinRM para conectarse a un equipo remoto. Este modificador obliga a PowerShell a usar el parámetro HostName para establecer una conexión remota basada en SSH.
Este parámetro se introdujo en PowerShell 6.0.
Tipo: | SwitchParameter |
Valores aceptados: | true |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-Subsystem
Especifica el subsistema SSH usado para la nueva PSSession.
Especifica el subsistema que se va a usar en el destino tal como se define en sshd_config. El subsistema inicia una versión específica de PowerShell con parámetros predefinidos. Si el subsistema especificado no existe en el equipo remoto, se produce un error en el comando.
Si no se usa este parámetro, el valor predeterminado es el powershell
subsistema.
Tipo: | String |
Posición: | Named |
Valor predeterminado: | powershell |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-ThrottleLimit
Especifica el número máximo de operaciones simultáneas que se pueden establecer para ejecutar este comando. Si omite este parámetro o escribe un valor 0, se usa el valor predeterminado, 32.
El límite solo se aplica al comando actual, no a la sesión ni al equipo.
Tipo: | Int32 |
Posición: | Named |
Valor predeterminado: | 32 |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-UserName
Especifica el nombre de usuario de la cuenta usada para ejecutar un comando en el equipo remoto. El método de autenticación de usuario depende de cómo se configura Secure Shell (SSH) en el equipo remoto.
Si SSH está configurado para la autenticación de contraseña básica, se le pedirá la contraseña de usuario.
Si SSH está configurado para la autenticación de usuario basada en claves, se puede proporcionar una ruta de acceso del archivo de claves a través del parámetro KeyFilePath y no se produce ningún mensaje de contraseña. Si el archivo de clave de usuario del cliente se encuentra en una ubicación conocida de SSH, el parámetro KeyFilePath no es necesario para la autenticación basada en claves y la autenticación del usuario se produce automáticamente en función del nombre de usuario. Para más información, consulte la documentación de SSH de la plataforma sobre la autenticación de usuario basada en claves.
No es un parámetro obligatorio. Si no se especifica el parámetro UserName , se usa el nombre de usuario que inició sesión actual para la conexión.
Este parámetro se introdujo en PowerShell 6.0.
Tipo: | String |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-UseSSL
Indica que este cmdlet usa 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 PowerShell transmitido a través de la red. El parámetro UseSSL es una protección adicional que envía los datos a través de HTTPS, en lugar de HTTP.
Si usa este parámetro, pero SSL no está disponible en el puerto que se usa para el comando, se produce un error en el comando.
Tipo: | SwitchParameter |
Posición: | Named |
Valor predeterminado: | False |
Requerido: | False |
Aceptar entrada de canalización: | False |
Aceptar caracteres comodín: | False |
-VMId
Especifica una matriz de identificadores de máquinas virtuales.
Tipo: | Guid[] |
Alias: | VMGuid |
Posición: | 0 |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | True |
Aceptar caracteres comodín: | False |
-VMName
Especifica una matriz de nombres de máquinas virtuales.
Tipo: | String[] |
Posición: | Named |
Valor predeterminado: | None |
Requerido: | True |
Aceptar entrada de canalización: | True |
Aceptar caracteres comodín: | False |
Entradas
Puede canalizar un comando en un bloque de script a Invoke-Command
. Use la $Input
variable automática para representar los objetos de entrada en el comando .
Salidas
System.Management.Automation.PSRemotingJob
Si usa el parámetro AsJob , este cmdlet devuelve un objeto de trabajo.
Si usa el parámetro InDisconnectedSession , este cmdlet devuelve un objeto PSSession .
De forma predeterminada, este cmdlet devuelve la salida del comando invocado, que es el valor del parámetro ScriptBlock .
Notas
PowerShell incluye los siguientes alias para Invoke-Command
:
- Todas las plataformas:
icm
En Windows Vista y versiones posteriores del sistema operativo Windows, para usar el parámetro ComputerName de Invoke-Command
para ejecutar un comando en el equipo local, debe ejecutar PowerShell mediante la opción Ejecutar como administrador .
Al ejecutar comandos en varios equipos, PowerShell se conecta a los equipos en el orden en que aparecen en la lista. Sin embargo, la salida del comando se muestra en el orden en que se recibe de los equipos remotos, lo que puede ser diferente.
Los errores resultantes del comando que Invoke-Command
se ejecuta se incluyen en los resultados del comando.
Los errores que podrían suponer la terminación de un comando local se tratan como errores de no terminación en un comando remoto. Esta estrategia garantiza que los errores de terminación de un equipo no cierren el comando en todos los equipos en los que se ejecuta. Esta práctica se utiliza incluso cuando se ejecuta un comando remoto en un único equipo.
Si el equipo remoto no está en un dominio en el que confía 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, use el siguiente comando en el WSMAN
proveedor, donde <Remote-Computer-Name>
es el nombre del equipo remoto:
Set-Item -Path WSMan:\Localhost\Client\TrustedHosts -Value \<Remote-Computer-Name\>
Cuando se desconecta una PSSession mediante el parámetro InDisconnectedSession , el estado de sesión es Disconnected y la disponibilidad es None. El valor de la propiedad State es relativo a la sesión actual. Un valor de Disconnected significa que PSSession no está conectado a la sesión actual. Sin embargo, no significa que PSSession se desconecte de todas las sesiones. Podría estar conectada a una sesión diferente. Para determinar si puede conectarse o volver a conectarse a la sesión, use la propiedad Availability .
Un valor de Disponibilidad de None indica que puede conectarse a la sesión. Un valor de Busy indica que no se puede conectar a PSSession porque está conectado a otra sesión. Para obtener más información sobre los valores de la propiedad State de las sesiones, vea RunspaceState. Para obtener más información sobre los valores de la propiedad Availability de las sesiones, vea RunspaceAvailability.
Los parámetros HostName y SSHConnection se incluyeron a partir de PowerShell 6.0. Se agregaron para proporcionar comunicación remota de PowerShell basada en Secure Shell (SSH). PowerShell y SSH son compatibles con varias plataformas (Windows, Linux, macOS) y la comunicación remota de PowerShell funcionan en estas plataformas en las que PowerShell y SSH están instalados y configurados. Esto es independiente de la comunicación remota anterior de Windows basada en WinRM y muchas de las características y limitaciones específicas de WinRM no se aplican. Por ejemplo, las cuotas basadas en WinRM, las opciones de sesión, la configuración del punto de conexión personalizado y las características de desconexión o reconexión no se admiten actualmente. Para obtener más información sobre cómo configurar la comunicación remota ssh de PowerShell, consulte Comunicación remota de PowerShell a través de SSH.
El ssh
ejecutable obtiene los datos de configuración de los orígenes siguientes en el orden siguiente:
- opciones de línea de comandos
- Archivo de configuración del usuario (~/.ssh/config)
- Archivo de configuración para todo el sistema (/etcetera/ssh/ssh_config)
Los siguientes parámetros de cmdlet se asignan a ssh
parámetros y opciones:
Parámetro del cmdlet | parámetro ssh | opción ssh -o equivalente |
---|---|---|
-KeyFilePath |
-i <KeyFilePath> |
-o IdentityFile=<KeyFilePath> |
-UserName |
-l <UserName> |
-o User=<UserName> |
-Port |
-p <Port> |
-o Port=<Port> |
-ComputerName -Subsystem |
-s <ComputerName> <Subsystem> |
-o Host=<ComputerName> |
Los valores pasados explícitamente por parámetros tienen prioridad sobre los valores pasados en la tabla hash Options . Para obtener más información sobre ssh_config
los archivos, vea ssh_config(5).