Get-Service en PowerShell: auditar servicios de Windows

Get-Service en PowerShell: auditar servicios de Windows

Abres el Event Viewer después de una noche movida y encuentras errores de aplicación que nadie vio ocurrir. ¿La causa? Un servicio que debía estar en ejecución quedó detenido durante horas. El Get-Service de PowerShell es la herramienta que resuelve ese diagnóstico en segundos —y evita que te enteres del problema por el cliente.

Qué es Get-Service y cuándo usarlo

El Get-Service es un cmdlet nativo de PowerShell que devuelve objetos que representan los servicios instalados en Windows. Cada objeto trae propiedades como Name, DisplayName, Status y StartType —información suficiente para construir auditorías, alertas y scripts de remediación automatizados.

No necesita ningún módulo adicional. Funciona en PowerShell 5.1 (nativo en Windows 10/11) y en PowerShell 7.x. Es el paso natural después de aprender a auditar cuentas locales con Get-LocalUser.

Listar todos los servicios

Sin parámetros, el cmdlet devuelve todos los servicios de la máquina:

Get-Service

La salida predeterminada muestra Status, Name y DisplayName. Para ver todos los campos disponibles:

Get-Service | Select-Object *

Para buscar un servicio específico por nombre:

Get-Service -Name "wuauserv"   # Windows Update

Acepta comodines, lo que facilita mucho cuando solo conoces parte del nombre:

Get-Service -Name "sql*"       # todo lo que empieza con sql

Filtrar servicios por estado

La combinación con Where-Object es donde el cmdlet se vuelve realmente útil:

# Solo servicios en ejecución
Get-Service | Where-Object { $_.Status -eq "Running" }

# Solo servicios detenidos
Get-Service | Where-Object { $_.Status -eq "Stopped" }

Para ordenar por estado y tener una vista rápida de lo que está detenido:

Get-Service | Sort-Object Status | Format-Table -AutoSize

¿Cómo identificar servicios automáticos que se detuvieron?

Usa el filtro combinado de Status y StartType —es el diagnóstico más útil ante un problema post-arranque:

Get-Service | Where-Object { $_.Status -eq "Stopped" -and $_.StartType -eq "Automatic" }

Los servicios configurados para iniciar automáticamente pero que están detenidos indican un fallo, una dependencia que falló o una mala configuración. Cualquiera de esos escenarios necesita atención antes de convertirse en incidente.

Iniciar, detener y reiniciar servicios

El Get-Service devuelve objetos que puedes pasar directamente a los cmdlets de control:

# Iniciar un servicio detenido
Start-Service -Name "Spooler"

# Detener
Stop-Service -Name "Spooler"

# Reiniciar (detiene e inicia en secuencia)
Restart-Service -Name "Spooler"

Para reiniciar todos los servicios automáticos que están detenidos —útil en scripts de recuperación:

Get-Service |
  Where-Object { $_.Status -eq "Stopped" -and $_.StartType -eq "Automatic" } |
  Start-Service

Úsalo con cuidado: algunos servicios permanecen detenidos por diseño (servicios bajo demanda, por ejemplo). Revisa la lista antes de ejecutar Start-Service en lote.

Exportar inventario de servicios

Para generar un reporte y guardarlo como línea base de referencia:

Get-Service | Select-Object Name, DisplayName, Status, StartType |
  Export-Csv -Path "C:\Audit\servicios-$(Get-Date -Format 'yyyy-MM-dd').csv" -NoTypeInformation -Encoding UTF8

Comparar ese CSV entre distintas fechas revela servicios nuevos instalados (a veces el malware se instala como servicio de Windows) o servicios que desaparecieron tras una actualización problemática. Es una forma simple de línea base que complementa los logs de auditoría de PowerShell.

Verificar dependencias de servicios

Cuando un servicio no arranca, puede ser que dependa de otro que falló primero. Para inspeccionar la cadena:

# Lo que este servicio necesita para funcionar
(Get-Service -Name "Spooler").RequiredServices

# Quién depende de este servicio
(Get-Service -Name "RpcSs").DependentServices

Entender las dependencias acelera el diagnóstico cuando el Event Viewer muestra un error genérico de "el servicio no se pudo iniciar" —situación que aparece con frecuencia en los logs investigados con Get-WinEvent.

Ángulo de seguridad: detectar servicios sospechosos

El malware que instala persistencia como servicio de Windows usa patrones reconocibles:

  • Nombres parecidos a servicios legítimos (WindowsUpdate en lugar de wuauserv, por ejemplo)
  • DisplayName vacío o demasiado genérico
  • Ejecutable fuera de System32 o Program Files

Para verificar las rutas de los ejecutables, combínalo con Get-CimInstance:

Get-CimInstance Win32_Service |
  Select-Object Name, PathName, StartMode, State |
  Where-Object { $_.PathName -notlike "*System32*" -and $_.PathName -notlike "*Program Files*" }

Filtra servicios con ejecutables en ubicaciones inusuales —una señal de alerta que vale la pena cruzar con el monitoreo de puertos abiertos con Get-NetTCPConnection para confirmar si el servicio sospechoso también abre conexiones activas.

El Get-Service parece simple, pero combinado con filtros, exportación y verificación de dependencias se convierte en una herramienta real de auditoría. Si todavía no automatizas la revisión de servicios automáticos detenidos tras el arranque, este es el primer script para agregar al kit. Para avanzar en el tema, el post sobre auditoría de logs con PowerShell cubre el siguiente nivel de visibilidad del entorno Windows.

Comentarios