PowerShellでWindowsサービスを制御:Get-Serviceコマンドの5つの具体的な利用例

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を混ぜず、変更が必要な場合は別承認に分けます。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次