Conectar con equipo remoto Windows mediante la línea de comandos
En muchas ocasiones es útil conectarse a un equipo remoto utilizando la línea de comandos en lugar de las alternativas más conocidas basadas en GUI. De esta forma, se puden llevar a cabo tareas de administración, configuración, ejecución de scripts, etc. de froma transparente al usuario. Veamos diferentes formas de llevarlo a acabo.
WinRM
En sistemas Windows existe de forma nativa la herramienta Windows Remote Shell/Windows Remote Management (WinRS/WinRM), la cual permite la conexión entre equipos remotos. Para ello, el servicio asociado debe estar en ejecución en la máquina en la que queramos establecer conexión. Podemos comprobar que está activo mediante sc query WinRM o Get-Service winrm en PowerShell.
Tanto desde la tradicional línea de comandos cmd.exe como desde PowerShell podemos obtener una consola de comandos a un equipo remoto mediante
winrs -r:nombre_equipo -u:nombre_usuario cmd.exe(también podemos invocar powershell.exe si lo preferimos)
Puede que nos encontremos con problemas de autenticación, sobre todo si trabajamos en un entorno con diferentes dominios. Para solucionarlo, una manera es añadir en el equipo al que queremos acceder una lista de ordenadores de confianza que tienen permitido el acceso al mismo. Para ello se utiliza el comando
winrm s winrm/config/client '@{TrustedHosts="nombre_equipo.nombre_dominio.extension"}' Por otro lado, podemos realizar otras tareas con el comando winrm. Por ejemplo:
- Instalar un paquete
winrs -r:nombre_equipo msiexec.exe /i c:\ruta\nombre_paquete.msi /quiet- Ejecutar un script de PowerShell
winrs /r:nombre_equipo powershell.exe -nologo -noprofile -command c:\ruta\nombre_script.ps1PowerShell
Mediante PowerShell es posible establecer una conexión con un equipo remoto de forma más directa
Enter-PSSession -ComputerName nombre_equipo -Credential nombre_usuarioPara que la conexión pueda establecerse debe estar habilitado el servicio correspondiente en el equipo al que queremos acceder. Se puede comprobar con
Test-WsMan nombre_equipoEn caso de no estar habilitado el servicio habría que activarlo mediante
Enable-PSRemoting -ForceTambién podemos establecer otras formas de conexión. Por ejemplo, si solo queremos ejecutar unos comandos concretos o realizar unas tareas específicas podemos utilizar la siguiente sentencia, en la cual añadimos las ordenes que nos interesen en la opción -ScriptBlock
Invoke-Command -ComputerName nombre_equipo -credential nombre_usuario -ScriptBlock { Get-ChildItem C:\ }Se puede indicar la ejecución de un script mediante la opción -FilePath.
Por último, el comando New-PSSession permite iniciar una nueva sesión en un equipo remoto. Si abrimos varias conexiones es posible ejecutar luego Invoke-Command para invocar el mismo conjunto de ordenes sobre todas ellas. Por ejemplo, abrimos sesión en dos máquinas distintas
New-PSSession -ComputerName nombre_equipo01 -port 5985
New-PSSession -ComputerName nombre_equipo02 -port 5985y ejecutamos la misma orden en los dos equipos utilizando la opción -Session (Get-PSSession), que recupera toda las conexiones que tengamos abiertas
Invoke-Command -Session (Get-PSSession) -ScriptBlock { Get-ChildItem C:\ }PsExec.exe
PsExec.exe es una herramienta que forma parte de la suite Sysinternals y que permite ejecutar procesos en equipos remotos. Por ejemplo iniciar una consola de comandos. Existen dos ejecutables, psexec.exe y psexec64.exe, para arquitecturas de 32 y 64 bits respectivamente.
La sintaxis básica es
psexec64.exe -opciones \\Nombre_Equipo ComandoEntre las opciones disponibles destaca:
-
-s El proceso remoto se ejecuta con la cuenta System
-
-i El programa invocado interacciona con el Escritorio del equipo remoto
-
-c Copia un ejecutable al equipo remoto para su ejecución. Si se omite, el comando debe estar en el path del equipo remoto
-
-u Indica una cuenta de usuario con la que conectarse
Se puede indicar un equipo remoto, una lista de equipos separada por comas o un fichero con la lista de equipos mediante @nombre_fichero. Si se usa el asterisco (\\*) se ejecutará el comando en todos los equipos del dominio.
Ejemplos:
- Obtener una consola de comandos
psexec64.exe \\Nombre_Equipo -u Nombre_Usuario -p Clave_Usuario cmd.exe- Limpiar la caché DNS en todos los equipos de un dominio
psexec64.exe \\* -u Nombre_Usuario ipconfig /flushdns- Instalar un programa en una máquina remota
psexec64.exe \\Nombre_Equipo -u Nombre_Usuario -i -s "msiexec.exe /i paquete_instalador.msi" -c paquete_instalador.msi- Habilitar las conexiones remotas de PowerShell
psexec64.exe \\Nombre_Equipo -s c:\windows\system32\winrm.cmd quickconfig -quietPor último, para que psexec64.exe pueda funcionar es necesario que el servicio “File and Printer Sharing” esté activo y que el recurso admin$ esté compartido y sea accesible.