Puede usar PowerShell Remoting (que apareció en PowerShell 2.0) para ejecutar comandos en una o varias computadoras remotas. PS Remoting se basa en el protocolo Web Services for Management (WS-Management). Puede usar el modo de sesión interactiva remota PS, una conexión temporal o permanente a una computadora remota. En este artículo, veremos varios ejemplos de cómo ejecutar un script de PowerShell de forma remota.
Configuración de WinRM para la comunicación remota de PowerShell
Para conectarse a una computadora de forma remota a través de PowerShell, el WinRM (servicio de administración remota de Windows) debe estar habilitado y configurado en el dispositivo cliente remoto (está deshabilitado de forma predeterminada). La comunicación entre computadoras se realiza a través de protocolos HTTP o HTTPS, y todo el tráfico de red entre computadoras está encriptado. Puede usar NTLM y Kerberos para autenticarse en una computadora remota.
Para verificar el estado del servicio WinRM, ejecute el comando Get-service:
get-service winrm
Como puede ver, el servicio WS-Management se está ejecutando.
Si el servicio WinRM no se está ejecutando, debe habilitarlo en la computadora remota con el comando:
Enable-PSRemoting
Este comando prepara la computadora para la administración remota: inicia el servicio WinRM, cambia el tipo de inicio a Automático y agrega las excepciones necesarias al Firewall de Windows Defender.
Insinuación. PowerShell Remoting utiliza los puertos TCP HTTP (5985) y HTTPS (5986) para las comunicaciones de red. Si el Firewall de Windows Defender con seguridad avanzada está habilitado en la computadora remota, debe habilitar Administración remota de Windows (HTTP-In) normas:
-
WINRM-HTTP-en-TCP
-
WINRM-HTTP-en-TCP-NoScope
Puede habilitar las reglas de Windows Defender desde la consola gráfica o mediante PowerShell:
Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP" -RemoteAddress Any Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-NoScope" -RemoteAddress Any
Si el equipo remoto está en un grupo de trabajo (no unido al dominio de Active Directory) y un Público se le aplica el perfil de red (en lugar de Dominio o Privado), debe permitir explícitamente el tráfico WinRM entrante en el Firewall de Windows:
Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-PUBLIC" -RemoteAddress Any
Para probar la conexión a un servidor remoto a través de WinRM, use el siguiente comando:
Test-WSMan server1
Si obtiene una respuesta, se puede acceder a la computadora remota a través de PowerShell Remoting.
Insinuación. Si se está conectando a una computadora remota a través de PS Remoting mediante una dirección IP, es posible que reciba un error:
La conexión al servidor remoto 192.168.1.70 falló con el siguiente mensaje de error: El cliente WinRM no puede procesar la solicitud. La autenticación predeterminada se puede usar con una dirección IP en las siguientes condiciones: el transporte es HTTPS o el destino está en la lista TrustedHosts y se proporcionan credenciales explícitas.
En este caso, debe instalar un certificado HTTPS para PowerShell Remoting en la computadora remota (el camino largo) o agregar este host a los confiables en su computadora de administración:
Set-Item wsman:localhostClientTrustedHosts -value 192.168.1.70Luego reinicie el servicio WinRM:
Restart-Service WinRM
Ejecución de comandos remotos con PowerShell Remoting
Para conectarse de forma interactiva a una computadora remota (con un nombre de host Server1) a través de PowerShell, ejecute el siguiente comando:
Enter-PSSession Server1
La vista de la CLI de PowerShell cambiará. Al comienzo de la línea, estará el nombre de la computadora remota a la que está conectado a través de WinRM. Una vez que se establece la sesión remota, todos los comandos que se ingresan en la consola de PowerShell se ejecutan en la computadora remota. PS Remoting funciona de la siguiente manera: los comandos ingresados en la computadora local se transmiten a la computadora remota y se ejecutan allí, luego el resultado se transmite de vuelta. Dado que todos los comandos se ejecutan localmente, no hay necesidad de preocuparse por la compatibilidad con la versión y los módulos de PoSh.
Para finalizar la sesión interactiva remota, ejecute el comando:
Exit-PSSession
Solo las tareas de administración simples generalmente se realizan en computadoras remotas en el modo interactivo. Para ejecutar un comando complejo o ejecutar el script de PowerShell de forma remota, use el cmdlet Invoke-Command.
Uso de Invoke-Command para ejecutar secuencias de comandos de PowerShell de forma remota
El siguiente comando creará una conexión remota con la computadora Server1 y ejecutará el bloque de comandos especificado en el parámetro ScriptBlock. Después de eso, la sesión remota se cerrará automáticamente.
Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName server1
Si necesita ejecutar varios comandos secuenciales de PowerShell en una máquina remota, separe los comandos en el ScriptBlock usando punto y coma:
Invoke-Command -ScriptBlock {Restart-Service spooler;Get-Date; wmic qfe list} -ComputerName server1
Puede ejecutar la tarea en segundo plano ejecutando Invoke-Command con el parámetro -AsJob. Pero en este caso, el comando no devolverá el resultado a la consola de PoSh. Para obtener información detallada sobre el trabajo en segundo plano, use el cmdlet Receive-Job.
PowerShell le permite ejecutar scripts locales de PS1 en computadoras remotas. La idea es que almacene todas las instrucciones de PowerShell en un archivo .PS1 local en su computadora. Con PowerShell Remoting, puede transferir un archivo PS1 a una computadora remota y ejecutarlo allí.
Para ello, use el parámetro -FilePath en el cmdlet Invoke-Command en lugar de -ScriptBlock. Por ejemplo, para ejecutar el script c:pstune.ps1 en tres servidores remotos, puede usar el siguiente comando:
Invoke-Command -FilePath c:pstune.ps1 -ComputerName server1,server2,server3
El archivo de script de PowerShell se puede colocar en una unidad local o en una carpeta de red compartida. En este caso, para ejecutar el archivo de script de PS1, debe especificar la ruta UNC completa:
Invoke-Command -FilePath "\dc03Sharepstune.ps1" -ComputerName PCS12dd2
La principal ventaja de esta forma de ejecutar secuencias de comandos de PowerShell es que no es necesario copiar el archivo de secuencia de comandos de PS1 en equipos remotos. Puede usar no solo el script local sino también el script PS en una carpeta de red compartida a la que se puede acceder desde la computadora local.
Si los scripts de PowerShell no pueden ejecutarse en la computadora remota, aparecerá un error:
Invocar comando: el archivo c:Sharepstune.ps1 no se puede cargar porque la ejecución de scripts está deshabilitada en este sistema. Para obtener más información, consulte about_Execution_Policies
Puede cambiar la configuración de la política de ejecución de PowerShell en una computadora remota de acuerdo con esta guía o firmar su archivo de script de PowerShell con un certificado.
Si necesita ejecutar scripts de PowerShell con credenciales que no sean las del usuario actual, debe usar el parámetro Credential.
Primero, debe obtener la credencial y guardarla en una variable:
$cred = Get-Credential
Ahora puede ejecutar el script de PS en equipos remotos con los permisos de credenciales guardados:
Invoke-Command -FilePath c:pstune.ps1 -ComputerName server1,server2,server3 -Credential $cred
Puede guardar la lista de computadoras en un archivo de texto y ejecutar el script de PowerShell de forma remota en todas las computadoras a la vez:
Invoke-command -ComputerName (get-content c:psservers.txt) -filepath c:pstune.ps1
De forma predeterminada, el cmdlet Invoke-Command envía la secuencia de comandos de PS1 a 32 equipos remotos de la lista al mismo tiempo. Si hay más de 32 computadoras, PoSh verifica el estado de ejecución del script en las primeras 32 computadoras. Si se completa el script, el comando se ejecuta en la siguiente computadora. Con el parámetro ThrottleLimit, puede aumentar este límite, pero tenga cuidado de no sobrecargar su red.
Cuando ejecuta el cmdlet Invoke-Command en varias computadoras, puede verificar previamente si se puede acceder a la computadora remota a través de WinRM. Si la computadora está disponible, puede ejecutar el código de PowerShell en ella usando Invoke-Command:
$RemoteComputers= get-content c:psservers.txt ForEach $RemoteComputer in $RemoteComputers) { If (Test-WSMan -ComputerName $RemoteComputer) { Invoke-Command -ComputerName $RemoteComputer -FilePath c:pstune.ps1 }
Si desea pasar variables de sesión locales a una sesión remota de PowerShell, use el modificador $Using:
$name=”script1.ps1”
Invoke-Command -ComputerName dc03 -Scriptblock{ write-host $using:Name}
Puede usar el parámetro ConnectionUri en Invoke-Command para ejecutar el comando en aplicaciones de back-end como Exchange o servicios en la nube de Azure/AWS. Por ejemplo:
$Creds = Get-Credential $params = @{ ConfigurationName="Microsoft.Exchange" ConnectionUri = 'https://lonexch1.theitbros.com/PowerShell' Credential = $Creds Authentication = 'Basic' ScriptBlock = {Set-Mailbox BJackson -DisplayName "Brian Jackson"} } Invoke-Command @params
Uso de conexiones persistentes de PowerShell (sesiones)
Cada vez que ejecuta Invoke-Command, se crea una nueva sesión con la computadora remota. Esto requiere tiempo y recursos del sistema. En PowerShell, puede crear una sesión y ejecutar todos los comandos y scripts en ella.
Con el cmdlet New-PSSession, puede crear sesiones persistentes de PowerShell con equipos remotos.
Por ejemplo, creemos sesiones con tres computadoras y guardémoslas en la variable $PSSess:
Invoke-Command -FilePath c:pstune.ps1 -ComputerName server1,server2,server3 $PSSess = New-PSSession -ComputerName server1, server2, server3
Después de establecer una sesión, puede usarla para ejecutar comandos y scripts. Debido a que las sesiones son persistentes, puede obtener datos de ellas y utilizarlas en otros comandos y scripts.
Por ejemplo, el siguiente comando obtendrá una lista de procesos en servidores remotos y los almacenará en la variable $RemoteProcesses:
Invoke-Command -Session $PSSess {$RemoteProcesses = Get-Process}
Ahora puede usar esta variable en otros comandos en las mismas sesiones. En el siguiente ejemplo, usamos el cmdlet Where-Object para encontrar procesos que usan más de 500 MB de RAM):
Invoke-Command -Session $PSSess {$RemoteProcesses | where-object {$_.WorkingSet -GT 500000*1024}|select processname,@{l="Working Memory (MB)"; e={$_.workingset / 1mb}} |sort "Working Memory (MB)" -Descending}
La sesión remota persistente de PowerShell permanecerá activa hasta que cierre la consola de PowerShell o cierre o elimine la sesión a la fuerza mediante los cmdlets Disconnect-PSSession o Remove-PSSession, respectivamente.
Como puede ver, PowerShell brinda amplias oportunidades para ejecutar scripts y comandos en computadoras remotas. Los administradores de Windows seguramente pueden usar PowerShell Remoting además de la clásica herramienta PsExec de Sysinternals.
Recomendado para ti
- Este teclado profesional de 35 teclas con una sola mano con control avanzado programable te hace sentir más cómodo y crea tu propio teclado especial
- Mini portátil de 35 teclas, diseño mini que ofrece una experiencia de funcionamiento con una sola mano extremadamente simple
- Adecuado para tus manos y muñeca, simplifica el complejo procedimiento operativo, vence al rival más rápido en los juegos
- Teclado compatible con MAC, Win 2000, Win XP, Win ME, Vista, Win7, Win8, Android, Linux y más
- Brillante: retroiluminación LED, más fresco por la noche
- Bajo la tapa de esta llamativa caja RGB está el procesador AMD Ryzen 5 5500 tiene una frecuencia de reloj de alto rendimiento de 3,6 GHz y en combinación con la NVIDIA RTX 3060 con 12 GB de VRAM, DLSS y trazado de rayos, ofrece una experiencia gráfica de ensueño que hará que tu corazón se acelere.
- Gracias a los 16 GB de RAM a 3200 MHz y a la unidad SSD M.2 de 500GB, disfrutarás de los tiempos de carga más cortos y estarás siempre un paso por delante de tus rivales. Para una máxima comodidad, hemos preinstalado Windows 10 Pro en tu PCVIP y también hemos instalado una tarjeta WiFi. Sólo tienes que enchufar el PC, encenderlo y la diversión puede empezar de inmediato.
- Vas a convertirte en el mejor jugador en un tiempo récord gracias a la mejor configuración de ordenador gaming. No hay límites con nuestro innovador PC Gaming. Mejora tu experiencia de juego con el impresionante rendimiento del hardware de los PC Gaming de Ibericavip
- Rendimiento de primera clase gracias a la NVIDIA RTX 3060 con 12 GB de VRAM y ray tracing. Además, incluimos un monitor LED Full HD de 27 pulgadas, un teclado gaming RGB y un ratón gaming RGB con la mejor alfombrilla XXL
- Pantalla: Monitor Gaming Curvo 27" 165 Hz Full HD G-Sync Free Sync Compatible
- Potencia de salida máxima: 2200 VA / 1200 W
- 4 Salidas tipo "Schuko" con protección contra sobretensiones
- La regulación automática de tensión (AVR) protege los dispositivos conectados estabilizando los niveles de tensión entrantes
- SAI ideal para dispositivos domésticos y de oficina en casa; Módem y router, teléfono inteligente, ordenador, almacenamiento conectado a la red
- Incluye: APC Back-UPS BX, Manual de instrucciones