¿Cómo administrar los servicios de Windows con PowerShell?
Puede administrar los servicios de Windows no solo desde el complemento services.msc o la herramienta de línea de comandos sc.exe, sino también mediante PowerShell. En este artículo, consideraremos diferentes escenarios de administración de servicios de Windows con PowerShell.
Cmdlets de PowerShell utilizados para administrar los servicios de Windows
Hay ocho cmdlets de servicio básicos para ver el estado de los servicios de Windows y administrarlos. Para obtener la lista completa de cmdlets de administración de servicios, ejecute este comando:
Get-Help \*-Service-
Get-Service: permite obtener los servicios en una computadora local o remota tanto en estado de ejecución como detenido;
Nuevo-Servicio: crea un servicio. El cmdlet crea una nueva entrada para un servicio de Windows en el registro y en la base de datos del servicio;
Restart-Service: reinicia un servicio. El cmdlet envía el mensaje de reinicio a través del controlador de servicios de Windows;
Reanudar servicio: reanuda un servicio. El cmdlet envía un mensaje de reanudación al Administrador de servicios de Windows;
Establecer servicio: cambia la configuración de un servicio local o remoto, incluido su estado, descripción, nombre mostrado o modo de inicio. También puede usar este cmdlet para iniciar, detener o suspender un servicio;
Start-Service: inicia un servicio;
Stop-Service: detiene un servicio (el cmdlet envía un mensaje de detención al Administrador de servicios de Windows);
Suspender-Servicio: suspende un servicio. Un servicio suspendido aún se está ejecutando, pero no hace nada hasta que se reanuda su uso (por ejemplo, con el cmdlet Resume-Service).
Puede obtener una descripción detallada y ejemplos del uso de un cmdlet particular con Get-Help:
Get-Help Start-Service¿Cómo verificar el estado del servicio de Windows con Get-Service?
Puede obtener la lista de servicios y su estado (En ejecución/Detenido) en una computadora local o remota usando el cmdlet Get-Service. El parámetro -Nombre permite seleccionar servicios por nombre. El nombre del servicio se puede especificar utilizando el carácter comodín
*.
Si no sabe el nombre exacto del servicio, puede encontrarlo por su nombre mostrado usando el parámetro -DisplayName. Puede utilizar la lista de valores y comodines.
Use el cmdlet Get-Service con el parámetro -ComputerName para obtener el estado del servicio en una computadora remota. Puede consultar el estado del servicio en varias computadoras remotas a la vez especificando sus nombres separados por comas. Por ejemplo, el comando que se muestra a continuación obtiene el estado del servicio Spooler en las computadoras remotas ny-prnt1 y ny-prnt2.
Get-Service spooler -ComputerName ny-prnt1,ny-prnt2Status Name DisplayName
------ ---- -----------
Running spooler Print Spooler
Stopped spooler Print SpoolerPara mostrar todas las propiedades de un servicio, utilice el cmdlet Select-Object:
Get-Service spooler | Select-Object *El cmdlet Select-Object permite obtener propiedades específicas de un servicio. Por ejemplo, desea ver el nombre, el estado y las opciones disponibles del servicio Spooler:
Get-Service Spooler | Select DisplayName,Status,ServiceName,Can*
El cmdlet Get-Service tiene dos parámetros que le permiten ver las dependencias del servicio:
-DependentServices permite mostrar los servicios que dependen del servicio dado
-RequiredServices muestra los servicios de los que depende el servicio dado
El siguiente comando muestra los servicios necesarios para iniciar el servicio Spooler:
Get-Service -Name Spooler -RequiredServicesEl siguiente comando muestra los servicios que dependen de Spooler:
Get-Service -Name Spooler -DependentServicesSi desea encontrar los servicios con el estado o los parámetros específicos, use el cmdlet where-object. Por ejemplo, obtengamos la lista de servicios en ejecución:
Get-Service | Where-Object {$_.status -eq 'running'}Para mostrar los servicios con el tipo de inicio manual, ejecute este comando:
Get-Service | Where-Object {$_.starttype -eq 'Manual'}Utilice el siguiente script de PowerShell para verificar si existe un servicio de Windows específico en una computadora actual:
if (Get-Service "ServiceTest" -ErrorAction SilentlyContinue)
{
Write-host "ServiceTest exists"
}¿Cómo detener, iniciar o reiniciar el servicio con PowerShell?
Puede detener un servicio mediante el cmdlet Stop-Service. Para detener el Spooler, ejecute el comando:
Stop-Service -Name spoolerEl cmdlet Stop-Service no muestra nada después de la ejecución. Para ver el resultado, utilice el parámetro -PassThru.
Tenga en cuenta que no todos los servicios se pueden detener. Si hay algún servicio dependiente, verá un error:
Cannot stop service because it has dependent services. It can only be stopped if force flag set.Para forzar la detención de un servicio, utilice el parámetro -Force. Debe recordar que todos los servicios dependientes también se detendrán:
Stop-Service samss -Force -PassthruEl siguiente comando detendrá los servicios especificados (bits, spooler) si están en estado "En ejecución":
get-service bits,spooler | where {$_.status -eq 'running'} | stop-service -passthruA veces, los servicios cuelgan en el estado "Deteniéndose" y deben eliminarse a la fuerza.
El cmdlet Start-Service inicia un servicio detenido:
Start-Service -Name spooler -PassThruUn servicio no se iniciará si alguno de sus servicios dependientes se detiene. Para encontrarlos e iniciarlos, use el siguiente resumen de PowerShell:
get-service samss | Foreach { start-service $_.name -passthru; start-service $_.DependentServices -passthru}El cmdlet Suspend-Service puede pausar los servicios si admiten este estado. Para saber si se puede suspender un servicio, use el cmdlet Get-Service con la propiedad CanPauseAndContinue.
Get-Service samss | Format-List name, canpauseandcontinuePara mostrar la lista de todos los servicios que pueden estar en pausa, ejecute este comando:
Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"}Suspendamos el servicio SQLBrowser:
Suspend-Service -Name SQLBrowserPara reanudar un servicio suspendido, use el cmdlet Resume-Service :
Resume-Service -Name SQLBrowserEl siguiente comando reanudará todos los servicios suspendidos:
get-service | where-object {$_.Status -eq "Paused"} | resume-serviceEl cmdlet Restart-Service reiniciará un servicio:
Restart-Service -Name spoolerEste comando inicia todos los servicios de red detenidos en una computadora:
get-service net* | where-object {$_.Status -eq "Stopped"} | restart-serviceEstos comandos no tienen el parámetro -ComputerName, pero puede ejecutarlos en una computadora remota usando el cmdlet Invoke-Command o una canalización.
Por ejemplo, para reiniciar una cola de impresión en la computadora remota ny-prnt1, ejecute el comando:
Get-Service Spooler -ComputerName ny-prnt1 | Start-ServiceDe manera predeterminada, solo los administradores pueden iniciar/detener los servicios de Windows, pero puede otorgar permisos de inicio/detención/reinicio de un servicio específico a los usuarios que no son administradores.
Uso de Set-Service para cambiar la configuración del servicio
El cmdlet Set-Service le permite cambiar cualquier parámetro o configuración de un servicio en una computadora local o remota. Dado que el estado de un servicio es una propiedad, puede usar este cmdlet para iniciar, detener o suspender un servicio. Set-Service tiene el parámetro -StartupType que permite cambiar el tipo de inicio de un servicio.
Cambiemos el tipo de inicio de Spooler a automático:
Set-Service spooler -startuptype automatic -passthruPuede configurar el tipo de inicio manual:
Set-Service spooler -startuptype manual -passthru¿Cómo crear o eliminar un servicio de Windows a través de PowerShell?
New-Service: es un cmdlet para crear un nuevo servicio en Windows. Especifique el nombre y el archivo ejecutable para el nuevo servicio (incluso puede ejecutar un script de PowerShell como un servicio de Windows).
Vamos a crear un nuevo servicio con el nombre TestSvc:
new-service -name TestSvc -binaryPathName "C:\WINDOWS\System32\svchost.exe -k netsvcs"Obtenga la información sobre el tipo de inicio y la descripción del servicio mediante el cmdlet Get-WmiObject.
get-wmiobject win32_service -filter "name='testservice'"Puede cambiar la configuración del nuevo servicio usando el siguiente comando:
Set-Service -Name TestSvc -Description ‘My Service’ -StartupType ManualPara eliminar un servicio, ejecute este comando:
(Get-WmiObject win32_service -Filter ″name=′TestSvc′″).delete()Cambiar la cuenta de usuario que ejecuta el servicio de Windows
Puede usar PowerShell para cambiar la cuenta de usuario utilizada para iniciar un servicio. Obtenga el nombre de la cuenta utilizada para iniciar TestSvc:
get-wmiobject win32_service -filter "name='TestSvc'" | Select name,startnamePara cambiar el nombre de usuario y la contraseña de un servicio de Windows, ejecute los siguientes comandos:
$svc = get-wmiobject win32_service -filter "name='TestSvc'"
$svc.GetMethodParameters("change")Se muestra la lista de parámetros del método Change(). Cuente dónde están los parámetros StartName y StartPassword: ubicados en los lugares 20th y 21st respectivamente.
$svc | Invoke-WmiMethod -Name Change -ArgumentList @ ($null,$null,$null,$null,$null,$null,$null, $null,$null,$null,$null,$null,$null,$null,$null,$null, $null,$null,$null,"Administrator","!123Pa$$w0rd")O puede ingresar el nombre de una cuenta gMSA (la contraseña de la cuenta no se especifica en este caso).
Como puede ver, PowerShell facilita la administración de los servicios de Windows. Puede crear, detener, iniciar o reanudar servicios y cambiar sus propiedades. La mayoría de los cmdlets permiten administrar servicios en equipos remotos.


























