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.ps1

PowerShell

Mediante PowerShell es posible establecer una conexión con un equipo remoto de forma más directa

Enter-PSSession -ComputerName nombre_equipo -Credential nombre_usuario

Para 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_equipo

En caso de no estar habilitado el servicio habría que activarlo mediante

Enable-PSRemoting -Force

Tambié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 5985

y 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 Comando

Entre 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 -quiet

Por ú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.