Administración de servidores con PowerShell

Gestiona tus servidores fácilmente con PowerShell

|

Tiempo de lectura: 3 minutos

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

procesos servidorEn 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
historicoRedirigir 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"}
servicios en ejecucionIncluir 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
consulta reiniciosEn 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
test conexionComprobar 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
test varias conexionesPoner 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}
barra progresoY 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

registroExisten 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 😉


Avatar de Rubén Tubío

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Newsletter

Suscríbete y recibe periódicamente consejos muy útiles para tu web y ecommerce 🙂 Además, te regalamos
3 guías
: Digitalización, WordPress y Ciberseguridad.

Conviértete en afiliado

Gana dinero recomendando dinahosting a todo el mundo.