WinRM es una implementación de Microsoft del protocolo WS-Management (Web Service for Management), un protocolo estándar que permite la interoperabilidad entre hardware y sistemas operativos de diferentes proveedores. WinRM puede ejecutar órdenes de administración remota en equipos Windows mediante la consola WinRS o estableciendo una conexión remota a través de PowerShell.
Utiliza los siguientes puertos:
Equipo | Puerto |
---|---|
Servidor | 5985 TCP para HTTP |
Servidor | 5986 TCP para HTTPS |
Cliente | Puerto efímero TCP |
No es necesario instalar WinRM, ya que viene preinstalado en todas las versiones actuales de Windows.
Sin embargo, se puede configurar rápidamente el servicio con el siguiente comando:
C:\> winrm quickconfig -f
Con esta orden lleva a cabo las siguientes acciones:
Iniciar el servicio WinRM.
Configurar el servicio para que se inicie automáticamente.
Configurar los puertos para enviar y recibir mensajes WS-Management utilizando HTTP o HTTPS en cualquier IP del servidor.
Agregar excepciones al firewall para el servicio WinRM y abre los puertos para HTTP y HTTPS. Por defecto, solo agrega la excepción para la red actual y no permite conexiones desde otras redes (perfil público). Por lo tanto, después de ejecutar quickconfig
, debemos modificar la regla con el siguiente comando:
PS C:\> Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP" -Profile Any
Habilitación del servicio
El siguiente comando habilita e inicia el servicio:
PS C:\> Start-Service -name "winrm"
El siguiente comando configura el servicio para que se inicie el servicio cuando se encienda la máquina:
PS C:\> Set-Service -name "winrm" -StartupType Automatic
Deshabilitar el servicio
El siguiente comando para el servicio:
PS C:\> Stop-Service -name "winrm"
El siguiente comando configura el servicio como deshabilitado:
PS C:\> Set-Service -name "winrm" -StartupType Disabled
Comando | Descripción |
---|---|
winrm |
Utilidad para configurar y consultar el estado de WinRM. |
winrm -? |
Muestra la ayuda con todas sus opciones. |
No es necesario instalar WinRM, ya que viene preinstalado en todas las versiones actuales de Windows. Aunque no es necesaria la instalación, debemos iniciar el servicio WinRM, ya que a veces no está activo.
PS C:\> Start-Service -name "winrm"
PS C:\> Set-Service -name "winrm" -StartupType Automatic
A continuación, antes de realizar cualquier conexión con un servidor, debemos agregar el servidor a los hosts de confianza (TrustedHosts) y comprobar la conectividad con el servidor.
PS C:\> Set-Item WSMan:\localhost\Client\TrustedHosts <ipservidor>
PS C:\> Test-WSMan -ComputerName <ipservidor>
Programa | Descripción |
---|---|
winrs |
Utilidad de Windows para ejecutar una consola remota con WinRM. |
PowerShell |
Objeto PSSession , este objeto nos permite realizar conexiones tanto interactivas como no interactivas con una máquina remota mediante WinRM. |
El modo de uso de esta consola es:
winrs [-opción:valor] comando
Entre otras opciones, tenemos:
Opción | Descripción |
---|---|
-remote IP|nombre |
Nombre o IP de la máquina remota. |
-username usuario |
Usuario para conectarse a la máquina remota. |
-password clave |
Clave del usuario para conectarse a la máquina remota. |
Para ejecutar un comando remotamente, se utiliza la siguiente sintaxis:
C:\> winrs -remote:<ip> -username:<usuario> -password:<clave> <comando>
Para cerrar la sesión se utiliza el comando exit
o CTRL+C
.
Conexión winrs
Con winrs
, conectamos con el equipo remoto 192.168.100.150 con el usuario admin
y la contraseña clave
para ejecutar el comando cmd
(consola).
C:\> winrs -remote:192.168.1.150 -username:admin -password:clave cmd.exe
Para salir de la sesión utilizamos el comando exit
.
C:\> exit
Con el objeto PSSession
, podemos establecer conexiones interactivas y no interactivas con un servidor.
Para abrir o crear una sesión interactiva podemos proceder de dos formas diferentes:
Proporcionando directamente el usuario
Se utiliza el parámetro -Credential <usuario>
, lo que hace que PowerShell solicite la contraseña al establecer la conexión.
PS C:\> Enter-PSSession -ComputerName <ip> -Credential <usuario>
Al ejecutar este comando, aparecerá una ventana para introducir la contraseña del usuario especificado.
Si no se indica un usuario, intenta realizar la conexión con el usuario actual de la máquina cliente.
Usando un objeto credencial previamente creado
Primero se crea un objeto de tipo PSCredential
que contiene tanto el usuario como la contraseña. Luego, este objeto se pasa al parámetro -Credential
.
PS C:\> $pwd = ConvertTo-SecureString "clave" -AsPlainText -Force
PS C:\> $crd = New-Object System.Management.Automation.PSCredential ("usuario", $pwd)
PS C:\> Enter-PSSession -ComputerName <ip> -Credential $crd
De este modo, la conexión se realiza automáticamente utilizando las credenciales almacenadas en el objeto, sin necesidad de introducir la contraseña manualmente.
Es recomendable emplear un objeto credencial cuando se desea automatizar, repetir o aumentar la seguridad en el proceso de autenticación durante conexiones remotas.
Para desconectarse de la sesión interactiva, se utiliza el siguiente comando:
[Servidor]: PS C:\> Exit-PSSession
En este caso, el comando no solo cierra la sesión, sino que también la elimina del sistema.
Conexión WinRM interactiva
Conectar con el usuario admin al servidor WinRM de ip 192.168.1.150. A continuación cerrar la sesión.
PS C:\> Enter-PSSession -ComputerName 192.168.1.150 -Credential admin
[192.168.1.150]: PS C:\> Exit-PSSession
PS C:\>
Para crear una conexión no interactiva, creamos una variable de tipo sesión (PSSession
):
PS C:\> $rs = New-PSSession -ComputerName <ip> -Credential <usuario>
Al igual que con Enter-PSSession
, también se puede construir un objeto Credential
para evitar pasar el usuario y la contraseña directamente.
Con una conexión no interactiva, podemos realizar diversas acciones. Así si en la variable $rs
tenemos una sesión podemos:
Ver el estado de la sesión:
PS C:\> Get-PSSession -Id $rs.Id | Format-Table -AutoSize
Id Name ComputerName ComputerType State ConfigurationName Availability
-- ---- ------------ ------------ ----- ----------------- ------------
5 WinRM 192.168.1.150 RemoteMachine Opened Microsoft.PowerShell Available
Desconectar o cerrar la sesión:
PS C:\> Disconnect-PSSession -Session $rs
Reconectar o abrir la sesión:
PS C:\> Connect-PSSession -Session $rs
Pasar la sesión a modo interactivo:
PS C:\> Enter-PSSession -Session $rs
Cerrar y eliminar la sesión:
PS C:\> Remove-PSSession -Session $rs
Conexión WinRM no interactiva
Crear un objeto Credential
para el usuario admin con la contraseña P@ssw0rd, establecer una conexión no interactiva utilizando dicha credencial y, finalmente, cerrar la sesión.
PS C:\> $pwd = ConvertTo-SecureString "P@ssw0rd" -AsPlainText -Force
PS C:\> $crd = New-Object System.Management.Automation.PSCredential ("admin", $pwd)
PS C:\> $rs = New-PSSession -ComputerName 192.168.1.150 -Credential $crd
Otra ventaja de utilizar conexiones no interactivas es que se pueden usar en scripts y también copiar ficheros entre el servidor y el cliente.
Copiar ficheros del cliente al servidor:
PS C:\> Copy-Item <origen> -ToSession $rs -Destination <destino>
Copiar ficheros del servidor al cliente:
PS C:\> Copy-Item <origen> -FromSession $rs -Destination <destino>
Copia de ficheros
Copiar el fichero c:\doc\hola.txt
a la carpeta c:\tmp
del servidor.
PS C:\> Copy-Item "c:\doc\hola.txt" -ToSession $rs -Destination "c:\tmp"
Copia de ficheros
Copiar la carpeta c:\doc
del servidor y todos sus subdirectorios a la carpeta local c:\tmp
.
PS C:\> Copy-Item -Path "c:\doc" -FromSession $rs -Destination "c:\tmp" -Recurse