一つのWindows service状態確認では、画面に値が出たことと目的を満たしたことを分けて考えます。結論は「Get-Service -Nameで対象を一意に取得し、存在しない、Stopped、Pending、Runningを別statusとして扱います。Runningだけでは機能正常を保証しないため、依存関係、event、固有health checkも確認します。」。service内部Nameを固定し、Statusとapplication healthを別に判定する条件のもと、出力の意味、境界値、影響のある操作を順に確認します。
確認対象をservice nameで一意にする
サービス監視では、正確なServiceNameを一件に絞り、Statusと開始種類を別々に確認します。アプリケーションの正常性はサービスがRunningだけでは保証できないため、依存サービス、待受ポート、認証不要のヘルスエンドポイントも読み取り確認します。停止中と取得失敗を別の判定結果として記録します。
- Get-Service -Nameで正式NameとDisplayNameを確認する
- Get-CimInstance Win32_ServiceでStartModeとProcessIdを確認する
- DependentServicesとServicesDependedOnを読む
- service owner、期待状態、maintenance条件を確認する
Running・Stopped・Pending状態を文字列化する
対象を一意に読む
Get-Service -Name 'wuauserv' -ErrorAction Stop |
Select-Object Name,DisplayName,Status,StartType
Select-Object後のStatusだけでなく元objectを保持します。
存在しない場合を分ける
$svc=Get-Service -Name 'wuauserv' -ErrorAction SilentlyContinue
if($null -eq $svc){'NotInstalled'} elseif($svc.Status -eq 'Running'){'Running'} else{$svc.Status}
取得errorをStoppedと表示しません。自動監視ではerror streamも記録します。
依存関係を確認
$svc=Get-Service -Name 'bits'
$svc.ServicesDependedOn | Select-Object Name,Status
$svc.DependentServices | Select-Object Name,Status
停止や再起動を検討する前の読み取りです。
CIM情報を補足
Get-CimInstance Win32_Service -Filter "Name='bits'" |
Select-Object Name,State,StartMode,ProcessId,ExitCode
PathNameやaccountは機密性を考慮して必要時だけ表示します。
短い待機後に再取得
1..3 | ForEach-Object { Get-Date; Get-Service -Name 'bits' | Select-Object Name,Status; Start-Sleep 5 }
pendingを一回だけで断定せず、上限付きで変化を見ます。
NotInstalledを停止中と分ける
StatusはService Control Manager上の状態です。Runningでもprocess内のworkerが停止している場合があり、Stoppedでもmanual/trigger start設計なら正常です。StartType、trigger、maintenance、dependent applicationを合わせて判断します。Pendingが続く時間の閾値はservice固有です。
依存serviceとStartModeを補足する
Services console、Get-Service、Win32_Serviceを同時刻で照合し、application固有endpointやeventも確認します。監視scriptはNotInstalled、AccessDenied、Pending、Running、Stoppedをtestし、期待状態と異なる場合だけalertします。
短い再取得で一時stateを見分ける
- 取得失敗をStoppedと表示する
- DisplayNameをNameと混同する
- Runningを機能正常とする
- 依存serviceを見ない
- 監視のたび自動restartする
状態変更commandを監視scriptへ混ぜない
確認だけなら変更しません。Start-Service、Stop-Service、Restart-Serviceは利用者session、update、print job等へ影響するため、一般的な自動修復例にしません。変更前状態、依存、graceful手順、backup、起動順を記録し、異常時は元のStartTypeとStatusへ戻したうえでhealthを確認します。security serviceを停止しません。
ServiceControllerとCIMの結果を検収する
exactなservice NameをGet-Service -ErrorAction Stopで読み、NotInstalled、Stopped、Pending、Runningを分けます。Get-CimInstance Win32_ServiceのStartMode、ProcessId、ExitCodeとapplication healthを足し、SCM状態だけで正常とはしません。
BITSを四状態のobjectとして返す
$name='bits'
try { $s=Get-Service -Name $name -ErrorAction Stop; [pscustomobject]@{State=$s.Status.ToString();Name=$s.Name;StartType=$s.StartType} } catch [Microsoft.PowerShell.Commands.ServiceCommandException] { [pscustomobject]@{State='NotInstalled';Name=$name} }
service四状態を再取得結果で確定する
- 状態を取得:serviceが一件でRunning等のStatusとStartType/StartModeが取得でき、health endpointも応答する
- service未導入:ObjectNotFoundはNotInstalledとして明示し、Stoppedや取得errorに置換しない
- SCM・CIM error:AccessDenied、SCM/RPC error、pending timeoutはErrorRecordと経過秒を保存する
DisplayNameではなくNameを使い、pendingを一回だけ見て停止/稼働と断定しません。確認処理でStart-ServiceやRestart-Serviceを自動実行せず、依存serviceとmaintenance条件を別に評価します。
StartPendingとProcessId 0を試す
$w=Get-CimInstance Win32_Service -Filter "Name='bits'" -ErrorAction Stop
[pscustomobject]@{State=$w.State;StartMode=$w.StartMode;ProcessId=$w.ProcessId;ExitCode=$w.ExitCode}
未導入、Stopped、Running、StartPending/StopPending、Disabled、access deniedをtestします。SCM/CIM/endpointの三結果、取得時刻、pending継続秒を同じrecordへ残します。
瞬間的なStartPendingやStopPendingを即座に異常判定せず、短い上限付き待機後に再取得します。変更は行わず、Name、Status、StartType、依存関係を監視記録へ残します。

コメント