Cuando utilizamos Powershell para la administración de equipos en algunos casos, los comandos que utilizamos, suelen tener como parámetro el del equipo donde queremos que se ejecute, como por ejemplo el parámetro Computername. Estos comandos nos permiten ejecutar las tareas de forma remota pero llegaremos al caso en el que queramos ejecutar comandos de forma remota sin esa opción.
Para ejecutar comandos de forma remota con Powershell tenemos varias opciones.
Habilitar la ejecución remota
Como primer paso tenemos que habilitar la ejecución remota en el equipo donde queremos que se ejecuten los comandos. Para eso ejecutamos
1 |
Enable-PSRemoting -Force |
Esta es la salida del comando:
1 2 3 |
WinRM está configurado para recibir solicitudes en este equipo. WinRM se actualizó para administración remota. Se creó una escucha WinRM en HTTP://* para aceptar solicitudes de WS-Man en cualquier IP del equipo. |
Iniciar una sesión Interactiva
Podemos establecer una sesión de forma que los comandos que escribamos se ejecuten en el servidor remoto
1 |
Enter-PSSession Servidor01 |
Tras este comando vemos que el prompt de la ventana ha cambiado y ahora vemos el nombre del servidor entre corchetes:
1 |
[Servidor01]: PS C:\> |
Cualquier comando que indiquemos se ejecutará en el servidor indicado entre corchetes, en este caso Servidor01
Para cerrar la sesión tecleamos
1 |
Exit-PSSession |
Por ejemplo:
1 2 3 4 5 |
PS C:\> Enter-PSSession Servidor01 [Servidor01]: PS C:\> hostname Servidor01 [Servidor01]: PS C:\> Exit-PSSession PS C:\> |
Ejecutar un comando remoto
Si en lugar de tener una consola interactiva unicamente necesitamos la ejecución de un comando podemos utilizar
1 |
Invoke-Command |
Con este comando tenemos la posibilidad de ejecutar el mismo comando en varios servidores a la vez, por ejemplo:
1 |
Invoke-Command -ComputerName Servidor01, Servidor02 { hostname } |
El resultado que obtendriamos sería:
1 2 3 4 |
PS C:\> Invoke-Command -ComputerName Servidor01, Servidor02 { hostname } Servidor01 Servidor02 PS C:\ |
Establecer una sesión persistente
Si queremos ejecutar varios comandos de forma remota podemos crear una sesión de forma que podamos reutilizarla. Además podemos crear un objeto sesión para cada uno de los equipos remotos
Por ejemplo:
1 |
$Sesion = New-PSSession -ComputerName Servidor01, Servidor02 |
Una vez creada la sesión la podemos utilizar para la ejecución de los comandos remotos
1 |
Invoke-Command -Session $Sesion { hostname } |
Por ejemplo:
1 2 3 4 5 |
PS C:\> $Sesion = New-PSSession -ComputerName Servidor01, Servidor02 PS C:\> Invoke-Command -Session $Sesion { hostname } Servidor01 Servidor02 PS C:\ |
Ejecución remota con delegación de credenciales
Hay un caso en el que nos es necesario utilizar una configuración avanzada en el caso de la ejecución remota de comandos. Si el comando que ejecutamos intenta acceder recursos de un tercer equipo puede que existan problemas por las credenciales utilizadas.
Por ejemplo, desde el cliente Cliente01 ejecutamos de forma remota en el equipo Servidor01 un comando que accede a la carpeta \\Servidor02\Carpeta. Como la ejecución del comando en el Servidor01 no utiliza las credenciales del usuario que ejecuta el comando en Cliente01 el comando no puede acceder a la carpeta del Servidor02.
Para solventar este problema utilizamos Credential Security Support Provider también conocido como CredSSP. De esta forma podemos delegar nuestras credenciales para que se utilicen en el equipo remoto para acceder a otros recursos de otros equipos.
Para habilitar su uso es necesario configurar tanto el equipo cliente como el equipo servidor remoto.
En el equipo remoto ejecutamos:
1 |
Enable-WSManCredSSP -Role Server –Force |
Y obtenemos de salida
1 2 3 4 5 6 7 8 |
cfg : http://schemas.microsoft.com/wbem/wsman/1/config/service/auth lang : es-ES Basic : false Kerberos : true Negotiate : true Certificate : false CredSSP : true CbtHardeningLevel : Relaxed |
También tenemos que habilitar el uso de CredSSP
Para ello tenemos dos opciones
- Ejecutar el comando
1 |
winrm set winrm/config/service/auth '@{CredSSP="true"}' |
- Configurar una GPO que habilite
1 |
Computer Configuration \ Administrative Templates \ Windows Components \ Windows Remote Management (WinRM) \ WinRM Service \ Allow CreedSSP authentication |
- Ejecutar el comando para permitir delegar al servidor Servidor01
1 |
Enable-WSManCredSSP -Role Client -DelegateComputer Servidor01 –Force |
- Configurar una GPO que habilite
1 |
Computer Configuration \ Administrative Templates \ System \ Credential Delegation \ Allow Delegation Fresh Credentials |
1 |
wsman/Servidor01 |
Por ejemplo:
1 2 3 |
$Credenciales = Get-Credential $Sesion = New-PSSession -Computername Servidor01 -Credential $Credenciales -Authentication Credssp Invoke-Command -Session $Sesion { hostname } |
Te ha gustado la entrada SGUENOS EN TWITTER O INVITANOS A UN CAFE?
Buenos días;
Como puedo ejecutar este comando Enable-PSRemoting -Force de forma remota, es que administro una red de más de 400 maquinas
Hola Jonathan,
Todo depende de tu red…
Si todas las máquinas tienen las mismas credenciales para administrarlas, el sistema operativo de todas ellas, si aplicas gpos sobre ellas, habrá que saber si existen redes segmentadas,…
En la práctica poniendo que todas son por ejemplo Windows 7 Pro y tienes directorio activo lo puedes hacer con una GPO. Sino con un script con un listado…
La verdad que son muchos factores.
Gracias por comentar
Salu2