Cómo utilizar el comando de invocación de PowerShell
¿Quiere ejecutar un comando de PowerShell en una computadora o servidor remoto? Entonces no necesita abrir una conexión de escritorio remoto, porque puede usar PowerShell Invoke-Command para eso.
Invoke-Command le permite ejecutar comandos y scripts de PowerShell en una o más computadoras remotas. mientras redirige los resultados a su propia consola. Esto lo convierte en un excelente cmdlet para administrar dispositivos remotos rápidamente.
En este artículo, veremos qué se requiere para usar Invoke-Command y cómo usar el cmdlet.
Requisitos previos Invocación-Comando
Antes de que podamos usar Invoke-Command en un servidor o computadora remota, necesitaremos asegurarnos de que el servicio de administración remota de Windows se esté ejecutando. Además, si tiene el firewall de Windows habilitado en su red, entonces debemos verificar si el firewall no está bloqueando la conexión.
Para comprobar si una computadora remota acepta la administración remota, podemos usar un comando simple de PowerShell, Test-WSMan
Test-WSMan -Computername la-srv-dc01
Si recibe un error que indica que no puede conectarse al destino, entonces el servicio Administración remota de Windows no se está ejecutando. Para habilitarlo podemos usar el cmdlet de PowerShell Enable-PSRemoting en la computadora remota:
Enable-PSRemotingLa ventaja de este comando es que no solo inicia los servicios de administración remota, sino que también los configura para que se inicien automáticamente y crea la regla de excepción requerida en el firewall.
Pero una opción aún mejor es crear un nuevo objeto de política de grupo (GPO). De esta manera puede habilitar fácilmente el servicio de Administración remota en varias computadoras o servidores.
Puede encontrar la configuración de política en Configuración del equipo > Configuración de Windows > Configuración de seguridad > Servicios del sistema.
regla de firewall
El Firewall de Windows bloqueará todas las conexiones entrantes, incluida la conexión de Administración remota de Windows. Entonces, antes de que podamos usar Invoke-Command, necesitaremos permitir la conexión entrante.
También podemos usar el mismo GPO para crear la regla de entrada.
- Vaya a Configuración del equipo > Configuración de Windows > Configuración de seguridad > Firewall de Windows Defender con seguridad avanzada
- Haga clic derecho en Reglas de entrada y seleccione Nueva regla
- Seleccione Predefinido y elija Administración remota de Windows
- Seleccione la regla con perfil Dominio, Privado
- Elija Permitir la conexión y haga clic en finalizar.
Asegúrese de que las nuevas políticas estén actualizadas en el servidor/cliente mediante el comando GPUpdate.
Usando el comando Invocar
Invoke-Command en PowerShell le permite ejecutar un comando o script en una computadora remota. Cuando necesite ejecutar varios comandos en una computadora remota, es mejor usar el cmdlet New-PSSession.
La estructura de Invoke-Command es bastante sencilla, pero aún así, todavía hay bastantes opciones (parámetros) que podemos usar:
- ComputerName
Nombre de la computadora o dirección IP en la que ejecutar el comando. Para varias computadoras, separe los nombres con una coma
,- Credential
Credenciales para conectarse a una computadora remota
- FilePath
Especifica la ruta a un script local para ejecutar en las computadoras remotas.
- AsJob
Ejecute el comando remoto como trabajo en segundo plano en la computadora local
- InDisconnectedSession
Se utiliza para ejecutar el comando en una sesión desconectada en la computadora remota
- ScriptBlock
Script o comando para ejecutar
- ArgumentList
Se utiliza para pasar argumentos al cmdlet en el bloque de script.
Entonces, para simplemente ejecutar un comando de PowerShell en una computadora remota, solo necesitamos especificar el nombre de la computadora remota y el comando que queremos ejecutar dentro de un bloque de script. Por ejemplo, para recuperar la información de la computadora del controlador de dominio podemos hacer:
Invoke-Command -ComputerName la-srv-dc01 {Get-ComputerInfo}
Esto ejecutará el comando Get-ComputerInfo en el controlador de dominio (la-srv-dc01) y devolverá los resultados a la consola.
Ejecutar un script
En el ejemplo anterior solo ejecutamos un cmdlet de PowerShell simple. Pero también podemos ejecutar scripts completos en el ordenador remoto. Podrías simplemente escribir el script dentro del parámetro scriptblock, pero es más fácil almacenar el script en una variable o usar un archivo.
El siguiente ejemplo funciona bien, pero es un poco más difícil de leer de esta manera:
Invoke-Command -ComputerName la-srv-dc01 -ScriptBlock {Get-CimInstance Win32_LogicalDisk | Select-Object DeviceID, MediaType, @{Name="FreeSpace (GB)"; Expression={"{0:N2}" -f ($_.FreeSpace / 1GB)}}}Una mejor opción sería almacenar primero el script dentro de una variable. Luego podemos simplemente pasar la variable al bloque de script:
$script = {
Get-CimInstance Win32_LogicalDisk |
Select-Object DeviceID, MediaType, @{Name="FreeSpace (GB)"; Expression={"{0:N2}" -f ($_.FreeSpace / 1GB)}}
}
Invoke-Command -ComputerName la-srv-dc01 -ScriptBlock $scriptLa tercera opción es almacenar el script en su computadora local y consultarlo usando el parámetro -FilePath:
Invoke-Command -ComputerName la-srv-dc01 -FilePath c:\test\diskInfo.ps1Ejecutar en varias computadoras
Una de las grandes ventajas del cmdlet Invoke-Command en PowerShell es que también puede ejecutarlo en varias computadoras simultáneamente. Hay un par de opciones para hacer esto, simplemente podemos especificar los nombres de las computadoras separados por una coma:
Invoke-Command -ComputerName la-srv-dc01, la-srv-app01, la-srv-file01 -FilePath c:\test\diskInfo.ps1Otra opción para escribir esto es usar una tabla hash y splatting. Salpicar los parámetros hará que su script sea más fácil de leer cuando necesite agregar muchas propiedades.
$parameters = @{
ComputerName = 'la-srv-dc01', 'la-srv-app01', 'la-srv-file01', 'la-win11-lab03'
ScriptBlock = { Get-ComputerInfo }
}
Invoke-Command @parameters
Cuando necesita ejecutar un comando en muchas computadoras, digamos cien o más, entonces desea minimizar la carga en su computadora local. Para esto, podemos usar el parámetro InDisconnectedSession.
Si ejecuta el cmdlet Invoke-Command normalmente, su computadora local se conectará a la computadora remota, iniciará el script, esperará los resultados y se desconectará. Las partes de espera consumen la mayor parte del tiempo y recursos de su computadora local, especialmente cuando se conecta a 100 o más computadoras.
Con el parámetro InDisconnectedSession, el cmdlet solo se conectará a la computadora remota, iniciará el script y luego se desconectará. Esto reduce significativamente el tiempo total del proceso.
$parameters = @{
ComputerName = (Get-Content -Path C:\Test\Servers.txt)
InDisconnectedSession = $true
FilePath = '\\lazyadmin\scripts\InstallWinUpdates.ps1'
}
Invoke-Command @parametersUsando credenciales
Necesitará tener permiso en la computadora remota para ejecutar los comandos de PowerShell. Al ejecutar el comando en un servidor, probablemente no tendrá el permiso correcto de su estación de trabajo local.
Para solucionar esto podemos utilizar el parámetro -Credentials. Aquí puede ingresar la cuenta de usuario que desea usar para ejecutar el comando. PowerShell le solicitará la contraseña cuando ejecute el cmdlet Invoke-Command con el parámetro -Credential:
Invoke-Command -ComputerName la-srv-dc01 -Credential lazyadmin\administrator -Scriptblock {Get-ComputerInfo}Al igual que con la mayoría de los cmdlets de PowerShell, también puede pasar un objeto de credencial al cmdlet -Credential. Este método es especialmente útil cuando desea ejecutar varios comandos o necesita ejecutar diferentes comandos en diferentes computadoras remotas:
$cred = Get-Credential
Invoke-Command -ComputerName la-srv-dc01 -Credential $cred -Scriptblock {Get-ComputerInfo}Incluir variables locales
El uso de variables dentro del bloque de script es un poco diferente de lo que cabría esperar. Tomemos el siguiente ejemplo simplificado: queremos obtener todos los archivos de una ruta determinada en la computadora remota. En este caso, hemos almacenado la ruta dentro de una variable:
$path = "c:\test"
Invoke-Command -ComputerName la-srv-dc01 -Scriptblock {Get-Childitem -Path $path}El ejemplo anterior no funcionará. La computadora remota, en este caso la-srv-dc01, no sabe cuál es la variable $path, por lo que no devolverá ningún resultado.
Para pasar la ruta de la variable al bloque de script, tendremos que usar el modificador de alcance Using. El alcance Usando indica que la variable se crea en la sesión local y no en la remota. Entonces, para pasar la variable $path a la sesión remota, debemos hacer:
$path = "c:\test"
Invoke-Command -ComputerName la-srv-dc01 -Scriptblock {Get-Chiditem -Path $Using:path}Concluyendo
PowerShell Invoke-Command es una gran herramienta para administrar computadoras remotas. Le permite ejecutar rápidamente un comando sin la necesidad de abrir un escritorio remoto. Especialmente cuando necesitas ejecutar el comando en varias computadoras a la vez.
Asegúrese de consultar también el cmdlet New-PSSession; esta es realmente una mejor opción cuando necesita ejecutar varios comandos en una computadora remota.
Espero que este artículo te haya resultado útil. Si tienes alguna pregunta, deja un comentario a continuación.


