Los servicios en Windows son una de las partes más importantes del sistema operativo. Anteriormente, para obtener el estado de un servicio en Windows, tenía que usar el complemento gráfico services.msc o la herramienta de línea de comandos sc.exe (por ejemplo, sc.exe query wuauserv). En este artículo, veremos cómo verificar el estado de un servicio en Windows usando PowerShell.
Puedes usar el Obtener servicio Cmdlet de PowerShell para obtener una lista de todos los servicios instalados en los sistemas operativos Windows, su estado y tipo de inicio. Este y otros cmdlets que se usan para obtener el estado y administrar los servicios de Windows aparecieron por primera vez en PowerShell 1.0. En este artículo, mostraremos ejemplos típicos del uso del cmdlet Get-Service para obtener el estado de un servicio en computadoras locales o remotas (ejecutándose o deteniéndose), el tipo de inicio de servicios, también cubriremos cómo determinar las dependencias de servicios.
Puede obtener una lista de servicios en un equipo local o remoto mediante el cmdlet Get-Service. El comando Get-Service sin parámetros devuelve una lista de todos los servicios en la computadora local.
Para obtener la sintaxis completa del cmdlet Get-Service, ejecute el comando:
get-help Get-Service
SYNTAX Get-Service [[-Name] <string[]>] [-ComputerName <string[]>] [-DependentServices] [-RequiredServices] [-Include <string[]>] [-Exclude <string[]>] [<CommonParameters>]
Utilice Get-Service para comprobar el estado del servicio de Windows
Este comando enumerará todos los servicios locales de Windows, su estado (en ejecución o detenido) y el nombre para mostrar:
Get-Service
El cmdlet devuelve una lista de servicios ordenados por nombre. La lista contiene las siguientes propiedades del servicio de Windows:
- Estado – muestra si el servidor está Corriendo o Detenido;
- Nombre – muestra el nombre corto del servicio (usado con más frecuencia)
- Nombre para mostrar – nombre completo del servicio (más descriptivo y legible por humanos).
Para guardar la lista de servicios en un archivo de texto para una investigación futura, use el cmdlet Out-File:
Get-Service | Out-File "C:PSCurrent_Services.txt"
Para obtener dos o más estados de servicio, debe especificar sus nombres divididos por comas:
get-service bits, wuauserv
Si necesita mostrar solo los servicios en ejecución, use este comando:
Get-Service | Where-Object {$_.Status -EQ "Running"}
El operador de canalización (|) pasa los resultados al cmdlet Where-Object, que selecciona solo aquellos servicios para los que el parámetro Estado está establecido en «En ejecución». Si desea mostrar solo los servicios detenidos, especifique “Detenido”.

Puede obtener todas las propiedades del objeto de servicio utilizando Get-Member.
get-service | get-member
Como puede ver, estos objetos tienen el Typename – System.ServiceProcess.ServiceController. La captura de pantalla muestra todas las propiedades y métodos disponibles de los objetos de servicio en Windows (la mayoría de ellos no se utilizan cuando se muestran de forma predeterminada).

Puede mostrar las propiedades del servicio específico. Por ejemplo, necesitamos mostrar el nombre para mostrar, el estado y las características del servicio Windows Update (wuauserv):
get-service wuauserv | select Displayname,Status,ServiceName,Can* DisplayName : Windows Update Status : Stopped CanPauseAndContinue : False CanShutdown : False CanStop : False

Puede encontrar todos los servicios que se pueden pausar y reanudar sin reiniciar Windows:
Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"}
Por ejemplo, para obtener el tipo de inicio de servicios de Windows, ejecute el comando (funciona en PowerShell 5.1, introducido en Windows 10 / Windows Server 2016):
Get-Service | select -property name,starttype
Insinuación. Puede verificar la versión de PowerShell en su computadora con el comando:
$PSVersionTableSi solo necesita obtener el tipo de inicio del servicio, ejecute:
(Get-Service -Name wuauserv).StartupType
Hay 4 tipos posibles de servicios iniciales:
- Automático – inicio automático durante el arranque de Windows;
- AutomaticDelayedStart – inicio después del inicio del sistema;
- Manual – arranque manual;
- Discapacitado – el servicio está deshabilitado.
Puede filtrar la lista de servicios por el nombre del servicio utilizando el asterisco como comodín:
get-service wi*
Además, tenga en cuenta que PowerShell no es un lenguaje que distingue entre mayúsculas y minúsculas. Significa que los siguientes comandos devolverán resultados iguales:
get-service win* get-service WIN*
Para excluir algún servicio de la lista resultante, puede utilizar la opción -Excluir:
Get-Service -Name "win*" -Exclude "WinRM"

Puede ordenar los servicios en orden descendente por el valor de la propiedad Estado (los servicios en ejecución se muestran antes que detenidos):
get-service s* | sort-object status – Descending
¿Cómo comprobar si existe un servicio específico a través de PowerShell?
Si desea verificar si un servicio específico de Windows existe actualmente, puede usar los siguientes comandos (generalmente esta verificación se usa en varios scripts):
$servicename = “SomeService”
if (Get-Service $servicename -ErrorAction SilentlyContinue)
{
Write-Host "$servicename exists"
# do something
}
Demás {
Write-Host «$ servicename not found»
# hacer algo
}

Puede verificar si existe un servicio específico de Windows en una lista de computadoras / servidores remotos. Para realizar esta tarea, debe guardar la lista de computadoras remotas en el archivo de texto comp_list.txt en un formato simple:
server1 server2 server3 PC21 PC34

Ahora ejecute el siguiente script de PowerShell:
$servicename = "SomeService"
$list = get-content “c:pscomp_list.txt”
foreach ($server in $list) {
if (Get-Service $servicename -computername $server -ErrorAction 'SilentlyContinue'){
Write-Host "$servicename exists on $server "
# do something
}
else{write-host "No service $servicename found on $server."}
}
Use PowerShell para verificar el estado del servicio en una computadora remota
Puede usar el cmdlet Get-Service para obtener el estado de los servicios no solo en los equipos locales sino también en los remotos. Para hacer esto, use el –Nombre del ordenador parámetro. Puede usar el nombre NetBIOS, FQDN o una dirección IP como nombre de computadora. La conexión a computadoras remotas se establece no a través de PowerShell Remoting (WinRM), sino a través del Administrador de servicios (similar al comando sc.exe).
get-service wuauserv -ComputerName remotePC1
En PowerShell v3, puede obtener el estado de los servicios en varias computadoras remotas a la vez (sus nombres deben estar separados por comas).
get-service spooler -ComputerName remotePC1,remotePC2, remotePC3| format-table Name,Status,Machinename –autosize

Use el cmdlet format-table en este ejemplo para obtener una tabla más conveniente con la lista del estado de los servicios.
Además, puede obtener el estado del servicio en una lista de computadoras remotas que se almacena en un archivo de texto sin formato:
$list = get-content “c:pscomp_list.txt”
Get-Service -Computername (Get-Content -path “c:pscomp_list.txt”) -Name spooler | Select-Object MachineName,Name,Displayname,Status | Sort-Object Status
O puede verificar el estado del servicio en todas las computadoras en una AD OU específica:
$Computers = (Get-ADComputer -SearchBase ‘OU=Servers,OU=UK,DC=theitbros,DC=com’).names
foreach ($computer in $computers)
{
Get-Service -ComputerName $computer.Name -Name wuauserv | Where-Object {$_.status -eq "running"} | select status,name,machinename
}
Para reiniciar un servicio en una computadora remota, use el siguiente comando:
Get-Service wuauserv -ComputerName server1| Restart-Service
Utilice Get-Service para mostrar las dependencias del servicio
El cmdlet Get-Service tiene otros dos parámetros útiles que puede usar al administrar los servicios de Windows. El Servicios dependientes El parámetro devuelve servicios que dependen de este servicio. El RequiredServices El parámetro devuelve los servicios de los que depende este servicio.
El siguiente comando recibe los servicios que debían ejecutarse antes de iniciar el servicio LanmanWorkstation.
Get-Service -Name LanmanWorkstation –RequiredServices

El siguiente comando devuelve servicios dependientes que requieren el servicio LanmanWorkstation.
Get-Service -Name LanmanWorkstation -DependentServices
Si detiene manualmente todos los servicios de dependencia, no podrá ejecutar su servicio. Para ejecutar automáticamente todos los servicios de dependencia, use el siguiente resumen de PowerShell:
get-service servicename | Foreach {start-service $_.name -passthru; start-service $_.DependentServices -passthru}
Administrar los servicios de Windows a través de PowerShell
Hay varios otros cmdlets útiles en el módulo de PowerShell para administrar servicios. Para enumerar todos los comandos de PowerShell disponibles que se utilizan para administrar los servicios de Windows, ejecute:
Get-Command -Noun Service

Puede usar estos cmdlets para iniciar, detener, reiniciar o cambiar el tipo de inicio del servicio.
Para administrar los servicios, asegúrese de ejecutar powershell.exe como administrador. Debe iniciar, detener, reiniciar o cambiar el tipo de inicio del servicio.
Parada de servicio:
Stop-Service -Name Windefend
Cuando detiene algunos servicios, puede aparecer un error:
Stop-Service: no se puede detener el servicio ‘SQL Server (MSSQLSERVER) (MSSQLSERVER)’ porque tiene servicios dependientes. Solo se puede detener si se establece el indicador Force.
Para forzar la detención de este y el servicio dependiente, utilice el -Fuerza parámetro:
Stop-Service –Name MSSQLSERVER -Force
Inicie el servicio:
Start-Service -Name Windefend
Reinicie el servicio:
Restart-Service -Name Windefend
Si necesita cambiar el tipo de inicio del servicio, por ejemplo de Automático a Deshabilitado, ejecute:
Set-Service 'WinRM' -StartupType Disabled





