Cómo gestionar servicios en PowerShell

  1. Listar Servicios en PowerShell
  2. Encontrar Servicios Remotos en PowerShell
  3. Iniciar y Detener Servicios en PowerShell
  4. Reiniciar Servicio en PowerShell
  5. Cambiar el Tipo de Inicio de un Servicio en PowerShell
Cómo gestionar servicios en PowerShell

Los servicios de Windows son uno de los temas que casi todos los administradores de sistemas de Windows deben utilizar. Por supuesto, para gestionar los servicios de Windows, podríamos iniciar el complemento MMC services.msc para tareas puntuales, pero ¿qué pasa si necesitamos crear algo de automatización con PowerShell?

Este artículo discutirá todos los cmdlets de servicio de PowerShell, cómo usarlos y desarrollar nuestro script para gestionar servicios en muchas computadoras, local o remotamente.

Listar Servicios en PowerShell

Una de las tareas más básicas que podemos realizar con Windows PowerShell y servicios es simplemente enumerar qué servicios existen en una computadora local o remota. Por ejemplo, abre PowerShell, ejecuta el comando Get-Service y observa la salida.

El comando Get-Service por sí solo listará todos los servicios en la computadora local y el Estado, el Nombre y el NombreVisible de cada servicio.

Get-Service

Salida:

Status   Name               DisplayName
------   ----               -----------
Stopped  AarSvc_55244       AarSvc_55244
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Running  AMD Crash Defen... AMD Crash Defender Service
<SNIP>

Como muchos otros cmdlets, PowerShell no devuelve todas las propiedades para cada servicio.

Aunque, por ejemplo, nos gustaría ver un servicio requerido o quizás la descripción del servicio, podemos encontrar estas propiedades canalizando el resultado al comando Select-Object y usando el comodín * para representar todas las propiedades.

Get-Service ALG | select *

Salida:

Name                : ALG
RequiredServices    : {}
CanPauseAndContinue : False
CanShutdown         : False
CanStop             : False
DisplayName         : Application Layer Gateway Service
DependentServices   : {}
MachineName         : .
ServiceName         : ALG
ServicesDependedOn  : {}
ServiceHandle       :
Status              : Stopped
ServiceType         : Win32OwnProcess
StartType           : Manual
Site                :
Container           :

Encontrar Servicios Remotos en PowerShell

Quizás estemos en una red y necesitemos enumerar servicios en una o más computadoras de Windows remotas. Podríamos haber hecho esto en los días de Windows PowerShell usando el parámetro -ComputerName, pero desafortunadamente, ese parámetro ya no existe.

Una forma de inspeccionar los servicios de Windows en una computadora remota es utilizando Windows PowerShell Remoting (o PS Remoting). Usar PS Remoting puede encapsular cualquier comando local e invocarlo en una sesión remota como si lo estuviéramos haciendo localmente.

Asumiendo que tenemos habilitado PowerShell Remoting en una computadora remota, podríamos, por ejemplo, usar el cmdlet Invoke-Command para ejecutar el comando Get-Service en una computadora remota.

$cred = Get-Credential
Invoke-Command -ComputerName SRV1 -ScriptBlock { Get-Service } -Credential $cred

Salida:

Status         Name          DisplayName     PSComputerName
------         ----          -----------     --------------
Stopped     AarSvc_55244     AarSvc_55244        SRV1
<SNIP>

Una vez ejecutado, el cmdlet Invoke-Command pasa toda la información que Get-Service devolvió, y los servicios serían devueltos como se esperaba.

Nota la propiedad extra PSComputerName devuelta por el cmdlet Invoke-Command. También podemos crear un script simple para enumerar servicios en muchas computadoras remotas.

Iniciar y Detener Servicios en PowerShell

También podemos iniciar y detener servicios con Windows PowerShell.

Los cmdlets Start-Service y Stop-Service hacen precisamente lo que esperaríamos. A continuación, podemos usar la canalización o el parámetro -Name a continuación.

## Stop a service
$serviceName = 'wuauserv'
Stop-Service -Name $serviceName

## Stop a service with the pipeline
Get-Service $wuauserv | Stop-Service

Todos los cmdlets *-Service nos permiten completar los valores de nombre de servicio con los parámetros -Name y -DisplayName. Solo escribe el parámetro -Name seguido de un espacio y presiona la tecla Tab.

Veremos que recorre todos los servicios en la computadora local. El mismo concepto se aplica para iniciar también como un servicio.

## Start a service
$serviceName = 'wuauserv'
Start-Service -Name $serviceName

## Start service with the pipeline
Get-Service $wuauserv | Start-Service

Ambos comandos Start-Service y Stop-Service son idempotentes, lo que significa que si un servicio está iniciado o detenido y intentamos detener o iniciar el servicio cuando ya están en ese estado, los cmdlets omitirán el servicio.

Para detener e iniciar servicios remotos con PowerShell, nuevamente, necesitarás envolver estos comandos en un bloque de script y usar PowerShell Remoting para invocarlos de forma remota, como se muestra a continuación.

$cred = Get-Credential
$serviceName = 'wuauserv'
Invoke-Command -ComputerName SRV02 -ScriptBlock { Start-Service -Name $using:serviceName } -Credential $cred

Reiniciar Servicio en PowerShell

Para limitar la reutilización de código para reiniciar un servicio con Windows PowerShell, sería mejor usar el cmdlet Restart-Service. Este cmdlet hace precisamente lo que pensamos y opera de manera similar a los otros comandos de servicio.

Por ejemplo, si nos gustaría iniciar y detener el servicio wuauserv como se mostró en el ejemplo anterior, podríamos ahorrar algo de código simplemente canalizando la salida de Get-Service directamente a Restart-Service, como se muestra a continuación.

## Restart a service with the Name parameter
$serviceName = 'wuauserv'
Get-Service -Name $serviceName | Restart-Service

Cambiar el Tipo de Inicio de un Servicio en PowerShell

El tipo de inicio de un servicio es el atributo que dicta lo que los servicios hacen cuando Windows se inicia. Así que, nuevamente, tenemos algunas opciones.

  • Automático: El servicio se inicia automáticamente cuando Windows se inicia.
  • Deshabilitado: El servicio nunca se iniciará a menos que se cambie.
  • Manual: El servicio puede ser iniciado, pero debe hacerse manualmente.
  • Automático – Retrasado: El servicio se inicia automáticamente, pero se retrasa una vez que Windows arranca.

Primero, necesitamos saber qué es un tipo de inicio. Puedes encontrar esto con Get-Service.

Si estás usando Get-Service para encontrar el tipo de inicio, encontrarás que Get-Service lo llama Estado y se representa como la propiedad Estado.

(Get-Service -Name wuauserv | select *).StartType

Salida:

Manual

Una vez que sepas el tipo de inicio actual, podemos cambiarlo utilizando Set-Service. El siguiente ejemplo establece el tipo de inicio en Automático.

Set-Service -Name <service name> -StartupType Automatic
¿Disfrutas de nuestros tutoriales? Suscríbete a DelftStack en YouTube para apoyarnos en la creación de más guías en vídeo de alta calidad. Suscríbete
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

Artículo relacionado - PowerShell Service