Actualizado el miércoles, 26 julio, 2023
Hace ya varios años, Microsoft ha incluido PowerShell en su sistema operativo Windows Server como una nueva herramienta de línea de comandos diseñada para mejorar el entorno de scripting y comandos en la administración de servidores.
PowerShell tiene un lenguaje de scripting propio, basado en .NET Framework, y puede ayudarnos enormemente en nuestro día a día mediante la automatización de tareas y gestión de procesos.
Uno de sus grandes cambios es que se basa en objetos y no en texto, por lo que la salida de un comando es un objeto que puede ser enviado a otro comando.
Otra ventaja de esta herramienta es que toda la administración de Windows Server está disponible por PowerShell, es decir, todas las funciones del entorno gráfico se pueden ejecutar desde PowerShell y, por lo tanto, se pueden automatizar. De hecho, hay algunas tareas que podremos llevar a cabo solo con un conocimiento avanzado de PowerShell y no desde los entornos gráficos, por lo que si administras sistemas Microsoft es recomendable que sepas utilizarlo.
Además, Microsoft basa la administración de todos sus productos en PowerShell, por lo que si en tus servidores instalas SQL Server, Exchange, System Center, etc, tendrás cmdlets específicos extra para estos servicios que te permitirán su administración y scripting.
Ejemplos de uso de PowerShell
Con el objetivo de automatizar tareas en tus servidores, veamos algunos ejemplos que te van a venir muy bien. Cosas simples que seguramente has tenido que hacer en algún momento y te ha llevado un buen tiempo encontrar, como:
Listar los procesos de tu servidor
PS> Get-Process
En el listado de procesos anterior no tenemos el usuario asociado a cada uno, vamos a ir un poco más allá para obtenerlo:
PS> $usuarios = @{}
PS> gwmi win32_process |% {$usuarios[$_.handle] = $_.getowner().user}
PS> get-process | select processname,Id,@{l="Owner";e={$usuarios[$_.id.tostring()]}}
Listar los servicios de tu servidor
PS> Get-Service
Si estás familiarizado con el mundo Linux, muchos comandos tienen alias configurados, por lo que puedes ejecutar los siguientes comandos para agilizar la administración
PS> ls
PS> ps
Consultar el histórico de comandos ejecutados
PS> Get-History
Redirigir la salida de un comando hacia otro y filtrar el objeto
Por ejemplo, para sacar solo los servicios activos:
PS> Get-Service | Where-Object {$_.Status -eq "Running"}
Incluir comodines en los comandos
Por ejemplo, para reiniciar todos los servicios de red que empiecen por “net”:
PS> Get-Service -Name "net*" | Where-Object {$_.Status -eq "Stopped"} | Restart-Service
¿Quién no ha tenido que reemplazar texto en ficheros?
Con la siguiente línea lo podemos hacer, y complicarlo todo lo que queramos para automatizar muchas configuraciones:
PS> (Get-Content -Path "fichero.txt") | ForEach-Object {$_ -Replace "texto de búsqueda", "texto de reemplazo"} | Set-Content -Path "fichero.txt"
Alguien ha reiniciado el servidor. ¿Quién ha sido?
Vamos a consultar los últimos reinicios rápidamente 🙂
PS> Get-EventLog –Log System –Newest 1000 | Where-Object {$_.EventID –eq ‘1074’} | FT MachineName, UserName, TimeGenerated –AutoSize
En todos nuestros comandos podemos formatear la salida o bien redirigirla a un fichero csv, por ejemplo
PS> <comando> | Format-Table
PS> <comando> | Format-List
PS> <comando> | Export-CSV C:\salida.csv
Hacer un ping, pero un poco más completo, por IPv4 e IPv6 a la vez
PS> Test-Connection nombre_de_mi_servidor
Comprobar la conectividad a varios equipos
Podemos hacerlo en un solo comando, incluso desde orígenes diferentes:
PS> Test-Connection -ComputerName servidor01, servidor02, servidor03
PS> Test-Connection -Source equipo01, equipo02 -ComputerName servidor01, servidor02, servidor03 -Credential mi_dominio\administrador
Poner una barra de progreso a nuestro script
Así vemos cómo trabaja por nosotros, simulando que lanzamos un proceso en varios servidores:
PS> $servidores = 'servidor01', 'servidor02', 'servidor03', 'servidor04', 'servidor05', 'servidor06', 'servidor07', 'servidor08', 'servidor09', 'servidor10'
PS> $contador = 0
PS> foreach ($servidor in $servidores ) {
PS> $contador++
PS> Write-Progress -Activity 'Ejecución en varios servidores' -CurrentOperation "Ejecutando en $servidor" -PercentComplete (($contador / $servidores.count) * 100)
PS> Start-Sleep -Milliseconds 1000}
Y por último, una curiosidad
Seguro que alguna vez has tenido que navegar por el registro de Windows, consultar claves, listarlas, etc. Pues bien, con PowerShell puedes moverte por el registro como si se tratase de carpetas de Windows:
PS> cd HKCU:
PS> ls
Existen multitud de comandos disponibles en PowerShell para gestionar servidores. Lo interesante no es saberlos todos de memoria, sino conocer las posibilidades que nos ofrece el lenguaje y lo que puede aportarnos si combinamos varias técnicas como las que hemos visto anteriormente.
Aunque te parezca raro, PowerShell es de código abierto y admite contribuciones de la comunidad 🙂 El código está disponible en GitHub. Seguro que, con un poco de práctica, pronto empezarás a sacarle partido a PowerShell y podrás mejorar procesos automatizados en los Servidores Dedicados No Administrados y VPS No Administrados que tengas en dinahosting 😉
Deja una respuesta