1.9K
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 usar PowerShell para verificar el estado de un servicio de Windows en una computadora local o remota. Además, analizaremos el tipo de inicio de servicios y cubriremos cómo determinar las dependencias de los servicios.
Sintaxis del cmdlet Get-Service
Puede obtener una lista de los servicios instalados, su estado y tipo de inicio en una computadora local o remota usando el Obtener servicio Cmdlet de PowerShell. Cuando ejecuta 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>]
Uso de Get-Service para verificar el estado del servicio de Windows
Este comando enumerará todos los servicios locales de Windows, su estado (en ejecución, detenido o en pausa) y los nombres para mostrar:
Get-Service
El cmdlet devuelve una lista de servicios ordenados por nombre. La lista contiene las siguientes propiedades de servicio de Windows:
- Estado : muestra si el servicio está en ejecución o detenido.
- Nombre — muestra el nombre abreviado del servicio (usado con más frecuencia).
- Nombre para mostrar — nombre completo del servicio (más descriptivo y legible por humanos).
Para exportar la lista de servicios a un archivo de texto para futuras investigaciones, use el cmdlet Out-File:
Get-Service | Out-File "C:\PS\Current_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 filtro Where-Object de PowerShell, 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 tipo 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 aparecen en la vista predeterminada).
Puede mostrar las propiedades del servicio específico. Por ejemplo, necesitamos mostrar el nombre para mostrar, el estado y las funciones del servicio de actualización de Windows (wuauserv). Use el cmdlet Select-Object de PowerShell para enumerar solo las propiedades del servicio que desea:
Get-Service wuauserv | Select-Object Displayname,Status,ServiceName,Can*
Nombre para mostrar: Actualización de Windows
Estado: Detenido
Puede pausar y continuar: falso
CanShutdown: Falso
Puede Parar: Falso
Puede encontrar todos los servicios que se pueden pausar y reanudar sin reiniciar Windows:
Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"}
Puede verificar el tipo de inicio de los servicios de Windows con el comando:
Get-Service | select -property name,starttype
Si necesita obtener solo el tipo de inicio del servicio, ejecute:
(Get-Service -Name wuauserv).StartType
Hay 4 tipos de inicio posibles para los servicios de Windows:
- Automático — inicio automático durante el arranque de Windows.
- AutomaticDelayedStart — inicio después del arranque del sistema operativo.
- Manual — arranque manual.
- Desactivado — el servicio está deshabilitado.
Nota. Puede consultar cómo instalar y configurar el servicio SNMP en Windows.
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 distingue entre mayúsculas y minúsculas. Significa que los siguientes comandos devolverán resultados iguales:
get-service win* get-service WIN*
Para excluir algunos servicios de la lista resultante, puede utilizar el -Excluir opción:
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 los detenidos):
get-service s* | sort-object status –Descending
Consejo. Lamentablemente, el cmdlet Get-Service no le permite obtener información sobre la cuenta de usuario con la que se ejecuta el servicio. Si necesita encontrar todos los servicios que se ejecutan en cuentas de sistema no predeterminadas, use el cmdlet Get-CIMInstance:
Get-CIMInstance -Class Win32_Service -filter "StartName != 'LocalSystem' AND NOT StartName LIKE 'NT Authority%' " |Select-Object SystemName, Name, Caption, StartMode, StartName, State | Sort-Object StartName
Una tarea bastante común para un administrador al solucionar problemas de Windows es verificar cuáles de los servicios de Windows que deberían ejecutarse automáticamente están actualmente detenidos. Puede utilizar la opción FilterScript para buscar servicios que tengan el tipo de inicio automático y que no se estén ejecutando actualmente:
Get-Service | where -FilterScript {$_.Status -ne 'Running' -and $_.StartType -eq 'Automatic'} | ft 'Name','StartType','Status'
Tenga en cuenta también que PowerShell Core 7.x presenta propiedades adicionales de Get-Service que no están disponibles en Windows PowerShell 5.1 (por ejemplo, UserName, BinaryPathName, StartType). Puede obtener el valor de estas propiedades en la consola de pwsh.exe (PowerShell 7.x).
Get-Service wuauserv | select Username,Starttype,BinaryPathName
¿Cómo verificar el estado si existe un servicio específico a través de PowerShell?
Si desea verificar si actualmente existe un servicio específico de Windows, puede usar el siguiente script de PowerShell:
$servicename = “SomeService” if (Get-Service $servicename -ErrorAction SilentlyContinue) { Write-Host "$servicename exists" # do something } Else { Write-Host ” $servicename not found” # do something }
Puede verificar si existe un servicio de Windows específico en una lista de computadoras/servidores remotos. Para realizar esta tarea, debe guardar la lista de equipos remotos 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:\ps\comp_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."} }
Obtener el estado del servicio desde una computadora remota usando PowerShell
Puede usar el cmdlet Get-Service para obtener el estado de los servicios no solo en las computadoras locales sino también en las remotas. Para hacer esto, use el –Nombre de la computadora parámetro. Puede utilizar NetBIOS, el nombre FQDN o una dirección IP como nombre de equipo. La conexión a equipos remotos no se establece a través de PowerShell Remoting (WinRM), sino a través de Service Manager (similar al comando sc.exe).
get-service wuauserv -ComputerName remotePC1
Puede verificar 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
También puede comprobar el estado del servicio en una lista de equipos remotos desde un archivo de texto sin formato:
$list = get-content “c:\ps\comp_list.txt” Get-Service -Computername $list -Name spooler | Select-Object MachineName,Name,Displayname,Status | Sort-Object Status
O puede verificar el estado del servicio en todas las computadoras en una unidad organizativa específica de Active Directory:
$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
Nota. El cmdlet Get-Service en PowerShell Core (PowerShell 6.x y 7.x), a diferencia de Windows PowerShell 5.1, no tiene el parámetro ComputerName, por lo que no puede usarlo para verificar el estado de los servicios en equipos remotos.
Para acceder a equipos remotos desde dentro de PowerShell Core, debe usar PowerShell Remoting sobre WinRM. Por ejemplo, puede sondear el estado del servicio en varias computadoras remotas usando Invoke-Command. Por ejemplo:
$cred = Get-Credential Invoke-Command -ComputerName dc03,dc02 {get-service wuauserv} -Credential $cred
Use 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 parámetro devuelve servicios que dependen de este servicio. El Servicios requeridos 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
Enumere todos los servicios que tienen dependencias:
Get-Service | Where-Object {$_.RequiredServices -or $_.DependentServices} |FT -Property Status, Name, RequiredServices, DependentServices -auto
Si detiene manualmente todos los servicios de dependencia, no podrá ejecutar su servicio. Para ejecutar automáticamente todos los servicios de dependencia, use la siguiente línea de PowerShell:
get-service servicename | Foreach {start-service $_.name -passthru; start-service $_.DependentServices -passthru}
Administración de servicios de Windows a través de PowerShell
Hay otros cmdlets útiles en el módulo de PowerShell para administrar servicios. Para enumerar todos los comandos de PowerShell disponibles que se usan para administrar los servicios de Windows, ejecute:
Get-Command -Noun Service
Aquí hay una lista completa de los cmdlets de administración de servicios en PowerShell Core 7.3:
- Obtener servicio
- Nuevo servicio
- Quitar servicio
- Reiniciar servicio
- Servicio de currículum
- Servicio fijo
- Comienza el servicio
- Parada de servicio
- Servicio suspendido
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:
Servicio de detención: no se puede detener el servicio ‘SQL Server (MSSQLSERVER) (MSSQLSERVER)’ porque tiene servicios dependientes. Solo se puede detener si se establece el indicador Forzar.
Para forzar la detención de este y el servicio dependiente, use el -Fuerza parámetro:
Stop-Service –Name MSSQLSERVER -Force
Iniciar el servicio:
Start-Service -Name Windefend
Reiniciar el servicio:
Restart-Service -Name Windefend
Pista. Puede forzar el reinicio de un servicio de Windows colgado con los comandos:
$ServiceProcess = Get-CimInstance -ClassName Win32_Service -filter "name="myservicename"" Stop-Process -Id $ServiceProcess.ProcessId
Si necesita cambiar el tipo de inicio del servicio (por ejemplo, de Automático a Deshabilitado), ejecute:
Set-Service 'WinRM' -StartupType Disabled
O puede cambiar la descripción del servicio:
Set-Service 'myservice' -Description 'some test'
Puede configurar el servicio para que se ejecute con una cuenta de usuario específica. Anteriormente, estos ajustes solo se podían establecer manualmente en el Acceder pestaña en el Servicios interfaz gráfica de usuario de la consola.
Primero necesita obtener el nombre de usuario y la contraseña:
$Credential = Get-Credential
Una vez capturadas las credenciales, puede configurarlas para el servicio. El servicio debe detenerse antes de cambiar las credenciales:
$ServiceName="mysvc" Get-Service -Name $ServiceName | Stop-Service Set-Service -Name $ServiceName -Credential $Credential Get-Service -Name $ServiceName | Start-Service
Algunos servicios de Windows se pueden suspender con el comando Suspender-Servicio:
Get-Service -Name 'wuauserv'|Suspend-Service
Si intenta suspender un servicio que no admite este método, aparecerá un error:
Servicio suspendido: el servicio ‘Actualización de Windows (wuauserv)’ no se puede suspender porque el servicio no admite la suspensión ni la reanudación.
Para encontrar los servicios de Windows que puede pausar, ejecute el comando:
Get-Service | where CanPauseAndContinue | select -Property Name,CanPauseAndContinue,DisplayName
El cmdlet Resume-Service se usa para iniciar el servicio suspendido:
Get-Service -Name 'Winmgmt' | Suspend-Service | Resume-Service
Para crear un nuevo servicio con el cmdlet New-Service, debe especificar su nombre y la ruta al archivo binario:
New-Service -Name 'MyNewService' -BinaryPathName 'C:\ps\testsvc.exe'
Puede usar el cmdlet New-Service para especificar una credencial de cuenta para iniciar un servicio con:
$credential = Get-Credential New-Service -Name 'MyNewService'-BinaryPathName 'C:\ps\testsvc.exe' -DisplayName 'My Test Service' -Credential $credential -DependsOn WinRM
Pista. Ingrese el nombre de su cuenta de usuario de dominio como usuario@dominio.com.
Para eliminar un servicio:
Remove-Service -Name 'MyNewService'
Nota. El cmdlet Remove-Service está disponible en PowerShell Core 6.x +.