PowerShellでWindowsサービスを制御:Get-Serviceコマンドの5つの具体的な利用例の手順を先に要約すると「Get-Serviceはservice状態と依存関係を確認する読み取りcommandです。Name、DisplayName、Status、StartTypeを絞って取得し、変更前には依存service、停止影響、復旧方法を確認します。タイトルの「制御」は取得だけで自動停止を意味しません。」となります。対象環境はservice名と表示名を区別し、取得とStart/Stop/Restartを別の承認作業にする構成です。
service名とDisplayNameを取り違えない
Get-Serviceでは表示名ではなく一意なサービス名を基準に対象を絞り、Statusと依存サービスを読み取ります。開始種類が必要な場合はCIMのWin32_Serviceを同じNameで照合し、取得不能と該当なしを区別します。停止や再起動はこの確認結果から切り離し、影響する依存先を承認してから実施します。
- Get-Service -Nameで対象serviceの正式Nameを確認する
- Get-CimInstance Win32_ServiceでStartModeとPathNameを補足する
- DependentServicesとServicesDependedOnを確認する
- SLA、cluster、maintenance、service accountの管理責任を確認する
StatusとStartTypeを同時に確認する
依存先と依存元を別方向に読む
特定serviceを取得
Get-Service -Name 'wuauserv' | Select-Object Name,DisplayName,Status,StartType
Nameは内部名、DisplayNameは表示名です。wildcardで広く取得せず、変更対象を一意にします。
複数serviceの状態比較
Get-Service -Name 'wuauserv','bits' | Sort-Object Name |
Select-Object Name,Status,StartType
関連serviceを並べ、片方だけの状態で結論を出しません。取得失敗はErrorActionで記録します。
停止中の自動開始service候補
Get-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' } |
Select-Object Name,DisplayName,Status,StartType
候補表示であり障害確定ではありません。trigger startや遅延開始などの設計を個別に確認します。
依存関係を読む
Get-Service -Name 'bits' | Select-Object -ExpandProperty ServicesDependedOn
Get-Service -Name 'bits' | Select-Object -ExpandProperty DependentServices
停止や再起動の前提調査です。結果0件でもapplication側依存が無いとは限りません。
remote取得は権限を限定
Invoke-Command -ComputerName 'SERVER01' -ScriptBlock { Get-Service -Name 'bits' }
remote managementが承認・構成済みの場合だけ使います。credentialをscriptへ平文記載せず、接続先を固定します。
自動開始なのに停止中の候補を絞る
Runningはservice control manager上の状態で、applicationが正常応答している保証ではありません。StartPendingやStopPendingが長い場合はWaitForStatusのtimeoutを設計し、health endpointやevent logも確認します。StartType Automaticでもtrigger条件やdelayed startの差があります。service nameをprocess nameと同一視しません。
remote取得の権限とsessionを限定する
- DisplayNameをNameとして指定する
- Runningだけでhealth正常と判断する
- 依存関係を見ず再起動する
- 全Automatic停止serviceを自動起動する
- remote credentialをcodeへ埋め込む
Start・Stop操作を状態確認から分離する
同じserviceをGet-ServiceとGet-CimInstanceで照合し、event log、application health、listen portなどservice固有の指標を確認します。取得時刻とhostを記録し、数分後に再取得してpending状態を見ます。変更が無い確認作業では、service statusとStartTypeが前後で同じことを確認します。
Found・NotInstalled・ReadErrorを判定する
Get-ServiceはServiceControllerのStatusとStartTypeを返します。Runningはprocess内部のhealthを保証せず、NotFound、Stopped、StartPending、Runningを別状態として扱い、依存serviceとapplication endpointを追加確認します。
BITSをexact nameでobject化する
try { $s=Get-Service -Name 'bits' -ErrorAction Stop; [pscustomobject]@{State='Found';Name=$s.Name;Status=$s.Status;StartType=$s.StartType} } catch [Microsoft.PowerShell.Commands.ServiceCommandException] { [pscustomobject]@{State='NotInstalled';Name='bits'} }
稼働・未導入・取得不能を分類する
- serviceを取得:exactなservice Nameが一件でStatus/StartTypeを取得でき、依存関係も読める
- 未導入:未導入はGet-Service -ErrorAction StopのObjectNotFoundとして明示し、Stoppedに置換しない
- SCM・remoting error:access denied、remote session、SCM応答errorはErrorRecordへ残し状態値と混ぜない
DisplayNameはlocalizationで変わるため自動化はNameを使います。Runningだけを成功とせず、StartType Disabled、trigger start、pending継続、process endpoint不応答を点検します。確認記事で自動restartは行いません。
依存関係0件と停止不可を確認する
$s=Get-Service -Name 'bits' -ErrorAction Stop
[pscustomobject]@{DependsOn=@($s.ServicesDependedOn).Count;Dependents=@($s.DependentServices).Count;CanStop=$s.CanStop}
存在/不存在、Running/Stopped/Pending、Disabled、依存停止をtestします。Name、Status、StartType、ProcessId(CIM)、依存件数、health endpointを同時刻で保存します。
Stoppedは異常とは限らず、StartTypeやtrigger start、依存関係を合わせて読みます。状態確認のscriptへStart-Serviceを混ぜず、変更が必要な場合は別承認に分けます。

コメント