Entonces, si un servicio tiene un tipo de inicio "Automático" o "Manual" pero actualmente está detenido, me gustaría ejecutar un comando para ver esos problemas.
En PowerShell y CMD puedo ver uno u otro, pero no puedo encontrar una manera fácil de filtrar los datos según lo que necesito.
Básicamente estoy buscando hacer un guión para servicios de resolución de problemas. Podrá determinar si hay algún servicio que deba iniciarse (según su tipo de inicio) pero que no se esté ejecutando (detenido o suspendido).
El problema con el que me encuentro es que PowerShell o CMD no permiten un filtro en profundidad ni la canalización de resultados. ¿Alguien tiene alguna manera de ayudarme a resolver esto?
¿Cómo puedo solucionar este problema?
Respuesta1
Al miraresta preguntase te podría ocurrir esto para versiones antiguas de PowerShell:
Get-WmiObject -Class Win32_Service | Select-Object Name,State,StartMode | Where-Object {$_.State -ne "Running" -and $_.StartMode -eq "Auto"}
Con las versiones más nuevas (al menos 5, tal vez 3/4), también puede usar (lo que sugirió JC2k8):
Get-Service | Select-Object -Property Name,Status,StartType | Where-Object {$_.Status -eq "Stopped" -and $_.StartType -eq "Automatic"}
En versiones anteriores de PowerShell, el Get-Service
cmdlet no ofrece un miembro que tenga la extensión StartType
.
PowerShell admite una gran cantidad de filtrado y canalización. :)
Respuesta2
(get-service|?{ $_.Status -eq "Stopped" -and $_.StartType -eq "Automatic"})|
select DisplayName, StartType, Status
Respuesta3
Get-Service | Where-Object {$_.Status -eq "Stopped"} | where starttype -match automatic
Respuesta4
Puede intentar esto si se adapta a su problema. El siguiente código le ayuda a iniciar todos los servicios detenidos relacionados con Sophos AV que deberían estar ejecutándose porque tienen el tipo de inicio automático.
# Start specific automatic start services not running
$service = "*sophos*"
$server = "<server_name>"
$stoppedServices = (Get-WmiObject Win32_Service -ComputerName $server | Where-Object {$_.Name -like $service -and $_.StartMode -eq 'Auto' -and $_.State -ne "Running"}).Name
foreach ($stoppedService in $stoppedServices) {
Write-Host -NoNewline "Starting Server/Service: "; Write-Host -ForegroundColor Green $server"/"$stoppedService
Get-Service -ComputerName $server -Name $stoppedService | Start-Service
}