WindowsServer 2025 総合ガイド 第05回
Windowsサービスの管理 ― サーバーの心臓部を理解する
第4回では、PowerShellスクリプティングの基礎として、変数、条件分岐、ループ処理、関数の定義、エラーハンドリングを学びました。第5回となる今回は、Windows Serverを支える「サービス」について学びます。サービスはサーバーの心臓部とも言える重要なコンポーネントです。サービスの概念を理解し、状態確認、起動・停止、設定変更の方法を習得しましょう。
5.1 この記事で学ぶこと
- サービスの概念と役割を理解する
- サービスの状態確認・起動・停止ができる
- サービスのスタートアップの種類を設定できる
5.2 前提条件
- 第4回完了(PowerShellスクリプティングの基礎を理解)
- Windows Server 2025にリモートデスクトップ接続できる状態
- PowerShell 7.4を管理者として起動できる状態
5.3 Windowsサービスとは
Windowsサービスは、サーバーやPCの裏側で動作し続ける特別なプログラムです。普段目にするアプリケーションとは異なり、ユーザーインターフェースを持たず、バックグラウンドで黙々と仕事をこなしています。
5.3.1 サービスの定義と役割
Windowsサービスには、以下のような特徴があります。
| 特徴 | 説明 |
|---|---|
| バックグラウンド動作 | ユーザーインターフェースを持たず、裏側で動作する |
| 自動起動 | OS起動時に自動的に開始できる |
| ログオン不要 | ユーザーがログオンしていなくても動作する |
| システムアカウントで実行 | 特定のユーザーアカウント(LocalSystem、LocalService、NetworkServiceなど)で実行される |
サーバーが提供する多くの機能は、サービスとして実装されています。たとえば、以下のような機能がサービスとして動作しています。
- Webサーバー機能:IIS(W3SVC サービス)がWebページを配信
- リモートデスクトップ:Remote Desktop Services(TermService)がリモート接続を受け付け
- 時刻同期:Windows Time(W32Time)がシステム時刻を正確に保つ
- セキュリティ:Windows Defender(WinDefend)がマルウェアを監視
サーバー管理において、サービスの状態を把握し、適切に制御することは最も基本的かつ重要なスキルです。
5.3.2 Linuxのデーモンとの比較
Linuxを学んだことがある方は、「デーモン(daemon)」という概念をご存知かもしれません。Windowsのサービスは、Linuxのデーモンに相当する概念です。
| 項目 | Windowsサービス | Linuxデーモン |
|---|---|---|
| 管理ツール | services.msc、PowerShell、sc.exe | systemctl(systemd)、service |
| 設定ファイル | レジストリ | /etc/systemd/system/ 配下のユニットファイル |
| ログ | イベントログ | journald、syslog |
| 自動起動設定 | スタートアップの種類 | enable/disable |
概念は似ていますが、管理方法は大きく異なります。本シリーズではPowerShellを使ったWindows流の管理方法を学んでいきます。
5.3.3 サービスの依存関係
サービスには「依存関係」という重要な概念があります。あるサービスが正常に動作するために、別のサービスが先に起動している必要がある場合があります。
依存関係には2つの方向があります。
| 用語 | 説明 | 例 |
|---|---|---|
| 依存するサービス(ServicesDependedOn) | このサービスが動作するために必要な他のサービス | IISはHTTP.sysに依存 |
| 依存されるサービス(DependentServices) | このサービスに依存している他のサービス | RPC Endpointには多くのサービスが依存 |
依存関係を理解することは、サービスのトラブルシューティングにおいて重要です。あるサービスが起動しない場合、依存するサービスが停止していることが原因かもしれません。
5.4 サービスの状態確認
サービス管理の第一歩は、現在の状態を確認することです。PowerShellのGet-Serviceコマンドレットを使って、サービスの状態を確認しましょう。
5.4.1 Get-Serviceコマンドレット
Get-Serviceは、システム上のサービス情報を取得するためのコマンドレットです。
全サービス一覧の取得
[実行環境: PowerShell 7.4 (管理者)]
# 全サービスの一覧を表示
Get-Service
実行結果の例:
Status Name DisplayName
------ ---- -----------
Stopped AJRouter AllJoyn Router Service
Stopped ALG Application Layer Gateway Service
Stopped AppIDSvc Application Identity
Running Appinfo Application Information
Stopped AppMgmt Application Management
Running AppXSvc AppX Deployment Service (AppXSVC)
Running AudioEndpointBu... Windows Audio Endpoint Builder
Running Audiosrv Windows Audio
...
出力には、Status(状態)、Name(サービス名)、DisplayName(表示名)の3つのプロパティが表示されます。
特定サービスの指定
-Nameパラメータで特定のサービスを指定できます。
# 特定のサービスを指定
Get-Service -Name W32Time
実行結果の例:
Status Name DisplayName
------ ---- -----------
Running W32Time Windows Time
ワイルドカードを使った検索も可能です。
# 「Win」で始まるサービスを検索
Get-Service -Name Win*
実行結果の例:
Status Name DisplayName
------ ---- -----------
Running WinDefend Microsoft Defender Antivirus Service
Stopped WinHttpAutoProx... WinHTTP Web Proxy Auto-Discovery Se...
Running Winmgmt Windows Management Instrumentation
Running WinRM Windows Remote Management (WS-Manag...
表示名での検索
-DisplayNameパラメータで、表示名(人間が読みやすい名前)を使って検索できます。
# 表示名で検索(ワイルドカード使用)
Get-Service -DisplayName "*Remote*"
実行結果の例:
Status Name DisplayName
------ ---- -----------
Running TermService Remote Desktop Services
Running UmRdpService Remote Desktop Services UserMode Po...
Running WinRM Windows Remote Management (WS-Manag...
Stopped RemoteAccess Routing and Remote Access
Stopped RemoteRegistry Remote Registry
5.4.2 サービスの状態
サービスは以下のいずれかの状態を持ちます。
| 状態 | 説明 |
|---|---|
| Running | サービスは実行中で、正常に動作している |
| Stopped | サービスは停止している |
| Paused | サービスは一時停止している(再開可能) |
| StartPending | サービスは起動処理中 |
| StopPending | サービスは停止処理中 |
| ContinuePending | サービスは再開処理中 |
| PausePending | サービスは一時停止処理中 |
特定の状態のサービスだけを抽出するには、Where-Objectを使用します。
[実行環境: PowerShell 7.4 (管理者)]
# 実行中のサービスのみを表示
Get-Service | Where-Object { $_.Status -eq "Running" }
# 停止しているサービスのみを表示
Get-Service | Where-Object { $_.Status -eq "Stopped" }
5.4.3 サービス情報の詳細確認
Get-Serviceの出力には、デフォルトで表示されない多くのプロパティが含まれています。Select-Object *で全プロパティを確認できます。
[実行環境: PowerShell 7.4 (管理者)]
# サービスの全プロパティを表示
Get-Service -Name W32Time | Select-Object *
実行結果の例:
Name : W32Time
RequiredServices : {}
CanPauseAndContinue : False
CanShutdown : True
CanStop : True
DisplayName : Windows Time
DependentServices : {}
MachineName : .
ServiceName : W32Time
ServicesDependedOn : {}
ServiceHandle :
Status : Running
ServiceType : Win32ShareProcess
StartType : Automatic
Site :
Container :
UserName : NT AUTHORITY\LocalService
Description : Maintains date and time synchronization on all clients
and servers in the network...
DelayedAutoStart : False
BinaryPathName : C:\WINDOWS\system32\svchost.exe -k LocalService -p
PowerShell 7.4の追加プロパティ:PowerShell 6.0以降では、
UserName(実行アカウント)、Description(説明)、StartType(スタートアップの種類)、BinaryPathName(実行ファイルのパス)、DelayedAutoStart(遅延開始)などのプロパティが追加されました。Windows PowerShell 5.1ではこれらのプロパティを取得するにはWMI/CIMを使用する必要がありました。
依存関係の確認
サービスの依存関係は、DependentServicesとServicesDependedOnプロパティで確認できます。
# サービスが依存している他のサービス(このサービスの起動に必要)
Get-Service -Name Netlogon | Select-Object -ExpandProperty ServicesDependedOn
実行結果の例:
Status Name DisplayName
------ ---- -----------
Running LanmanWorkstation Workstation
# このサービスに依存している他のサービス(このサービスを必要としている)
Get-Service -Name RpcSs | Select-Object -ExpandProperty DependentServices
実行結果の例:
Status Name DisplayName
------ ---- -----------
Running WinRM Windows Remote Management (WS-Manag...
Running Netlogon Netlogon
Running W32Time Windows Time
Running Dnscache DNS Client
...
RpcSs(Remote Procedure Call)は多くのサービスが依存する基盤サービスであることがわかります。このようなサービスを停止すると、システム全体に影響が出る可能性があります。
5.5 サービスの起動・停止・再起動
サービスの状態を変更するためのコマンドレットを学びましょう。
5.5.1 Start-Service:サービスの起動
停止しているサービスを起動するには、Start-Serviceコマンドレットを使用します。
[実行環境: PowerShell 7.4 (管理者)]
# Print Spoolerサービスの状態を確認
Get-Service -Name Spooler
# サービスを起動
Start-Service -Name Spooler
# 起動を確認
Get-Service -Name Spooler
実行結果の例:
Status Name DisplayName
------ ---- -----------
Stopped Spooler Print Spooler
Status Name DisplayName
------ ---- -----------
Running Spooler Print Spooler
注意:サービスが「Disabled」(無効)に設定されている場合、
Start-Serviceはエラーになります。その場合は、先にSet-Serviceでスタートアップの種類を変更する必要があります。
5.5.2 Stop-Service:サービスの停止
実行中のサービスを停止するには、Stop-Serviceコマンドレットを使用します。
[実行環境: PowerShell 7.4 (管理者)]
# Print Spoolerサービスを停止
Stop-Service -Name Spooler
# 停止を確認
Get-Service -Name Spooler
実行結果の例:
Status Name DisplayName
------ ---- -----------
Stopped Spooler Print Spooler
-Forceオプション:依存サービスも停止
他のサービスが依存しているサービスを停止しようとすると、エラーが発生します。-Forceパラメータを使用すると、依存しているサービスも一緒に停止できます。
# 依存サービスがある場合も強制停止
Stop-Service -Name LanmanServer -Force
警告:
-Forceを使用する際は、依存サービスへの影響を十分に理解してから実行してください。運用中のサーバーでは、事前に依存関係を確認し、影響範囲を把握することが重要です。
5.5.3 Restart-Service:サービスの再起動
サービスを再起動(停止してから起動)するには、Restart-Serviceコマンドレットを使用します。
[実行環境: PowerShell 7.4 (管理者)]
# Print Spoolerサービスを再起動
Restart-Service -Name Spooler
# 状態を確認
Get-Service -Name Spooler
設定変更を反映させる場合や、サービスが応答しなくなった場合に再起動が有効です。
5.5.4 Suspend-Service、Resume-Service:一時停止と再開
一部のサービスは一時停止をサポートしています。一時停止すると、サービスは実行状態を維持したまま新しいリクエストの処理を停止します。
[実行環境: PowerShell 7.4 (管理者)]
# サービスが一時停止をサポートしているか確認
Get-Service -Name Spooler | Select-Object Name, CanPauseAndContinue
実行結果の例:
Name CanPauseAndContinue
---- -------------------
Spooler False
CanPauseAndContinueがTrueのサービスのみ、一時停止と再開が可能です。
# 一時停止をサポートするサービスを検索
Get-Service | Where-Object { $_.CanPauseAndContinue -eq $true }
5.5.5 操作の事前確認(-WhatIf、-Confirm)
サービスの操作は、システムに大きな影響を与える可能性があります。-WhatIfと-Confirmパラメータを使って、操作を安全に行いましょう。
-WhatIf:実行せずに結果を確認
-WhatIfパラメータを使用すると、実際には操作を実行せず、「何が起こるか」を表示します。
[実行環境: PowerShell 7.4 (管理者)]
# 実行せずに結果を確認
Stop-Service -Name Spooler -WhatIf
実行結果の例:
What if: Performing the operation "Stop-Service" on target "Print Spooler (Spooler)".
この出力は「もし実行したら、Print Spooler (Spooler) に対して Stop-Service を実行する」という意味です。実際にはサービスは停止されません。
ベストプラクティス:本番環境でサービス操作を行う前に、必ず
-WhatIfで影響範囲を確認する習慣をつけましょう。
-Confirm:確認プロンプトを表示
-Confirmパラメータを使用すると、操作前に確認プロンプトが表示されます。
# 確認プロンプト付きで停止
Stop-Service -Name Spooler -Confirm
実行結果の例:
Confirm
Are you sure you want to perform this action?
Performing the operation "Stop-Service" on target "Print Spooler (Spooler)".
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "Y"):
Yを入力するとサービスが停止され、Nを入力するとキャンセルされます。
5.6 サービスの設定変更
Set-Serviceコマンドレットを使用して、サービスの設定を変更できます。
5.6.1 Set-Serviceコマンドレット
Set-Serviceは、サービスのプロパティを変更するためのコマンドレットです。変更できる主な項目は以下のとおりです。
- スタートアップの種類(StartupType)
- 表示名(DisplayName)
- 説明(Description)
- 状態(Status)
5.6.2 スタートアップの種類
「スタートアップの種類」は、OSの起動時にサービスをどのように扱うかを決定する設定です。
| 種類 | 説明 | 用途 |
|---|---|---|
| Automatic | OS起動時に自動的に開始 | 常に必要なサービス(DNS Client、Windows Updateなど) |
| AutomaticDelayedStart | OS起動後、他のサービスが開始された後に開始 | 起動を遅らせても問題ないサービス |
| Manual | 手動で起動するまで開始しない | 必要なときだけ使用するサービス |
| Disabled | サービスを無効化(起動できない) | 使用しない、またはセキュリティ上無効にすべきサービス |
5.6.3 スタートアップの種類の変更
-StartupTypeパラメータを使用して、スタートアップの種類を変更します。
[実行環境: PowerShell 7.4 (管理者)]
# 現在のスタートアップの種類を確認
Get-Service -Name Spooler | Select-Object Name, StartType
# スタートアップの種類を「手動」に変更
Set-Service -Name Spooler -StartupType Manual
# 変更を確認
Get-Service -Name Spooler | Select-Object Name, StartType
実行結果の例:
Name StartType
---- ---------
Spooler Automatic
Name StartType
---- ---------
Spooler Manual
# スタートアップの種類を「自動」に戻す
Set-Service -Name Spooler -StartupType Automatic
自動(遅延開始)への変更
# 自動(遅延開始)に設定
Set-Service -Name Spooler -StartupType AutomaticDelayedStart
# 確認
Get-Service -Name Spooler | Select-Object Name, StartType, DelayedAutoStart
実行結果の例:
Name StartType DelayedAutoStart
---- --------- ----------------
Spooler AutomaticDelayedStart True
5.6.4 サービスの説明変更
-Descriptionパラメータでサービスの説明を変更できます。
[実行環境: PowerShell 7.4 (管理者)]
# サービスの説明を変更
Set-Service -Name Spooler -Description "印刷ジョブを管理するサービス(カスタム説明)"
# 確認
Get-Service -Name Spooler | Select-Object Name, Description
注意:システムサービスの説明を変更することは一般的には推奨されません。ここでは機能の説明のために紹介しています。
5.7 CIM/WMIによる詳細情報取得
Get-Serviceは便利なコマンドレットですが、すべてのサービス情報を取得できるわけではありません。より詳細な情報が必要な場合は、CIM(Common Information Model)を使用します。
5.7.1 Get-CimInstance Win32_Service
Get-CimInstanceコマンドレットでWin32_Serviceクラスを指定すると、サービスの詳細情報を取得できます。
[実行環境: PowerShell 7.4 (管理者)]
# CIMでサービス情報を取得
Get-CimInstance -ClassName Win32_Service -Filter "Name='W32Time'" |
Select-Object Name, DisplayName, State, StartMode, StartName, PathName
実行結果の例:
Name : W32Time
DisplayName : Windows Time
State : Running
StartMode : Auto
StartName : NT AUTHORITY\LocalService
PathName : C:\WINDOWS\system32\svchost.exe -k LocalService -p
5.7.2 パス情報、ログオンアカウントの確認
Win32_Serviceクラスには、Get-Serviceでは取得しにくい情報も含まれています。
| プロパティ | 説明 |
|---|---|
| PathName | サービスの実行ファイルパスと起動引数 |
| StartName | サービスを実行するアカウント |
| ProcessId | 実行中のプロセスID(PID) |
| ExitCode | 最後の終了コード |
| ErrorControl | 起動失敗時の動作 |
[実行環境: PowerShell 7.4 (管理者)]
# 自動起動で停止しているサービスを検索(問題の兆候を発見)
Get-CimInstance -ClassName Win32_Service |
Where-Object { $_.StartMode -eq "Auto" -and $_.State -ne "Running" } |
Select-Object Name, DisplayName, State, ExitCode
自動起動に設定されているのに停止しているサービスは、何らかの問題がある可能性があります。このクエリは、トラブルシューティングの出発点として有用です。
5.7.3 Get-Serviceとの使い分け
Get-ServiceとGet-CimInstance Win32_Serviceの使い分けを整理します。
| ユースケース | 推奨コマンド | 理由 |
|---|---|---|
| サービス一覧の確認 | Get-Service | シンプルで高速 |
| サービスの起動/停止 | Start/Stop/Restart-Service | 直接操作できる |
| スタートアップの種類変更 | Set-Service | 直接変更できる |
| 実行アカウント、パスの確認 | Get-CimInstance | 詳細情報が取得できる |
| 複雑なクエリ | Get-CimInstance | WQLで柔軟にフィルタリング可能 |
補足:CIMコマンドレット(
Get-CimInstanceなど)は、従来のWMIコマンドレット(Get-WmiObjectなど)に代わる新しい方式です。CIMはWS-Management(WSMan)プロトコルを使用し、ファイアウォールを通過しやすく、リモート管理に適しています。本シリーズでは、CIMコマンドレットを推奨します。
5.8 重要なシステムサービス
Windows Server 2025には多数のサービスがありますが、特に重要なシステムサービスを紹介します。これらのサービスの役割を理解しておくことは、トラブルシューティングに役立ちます。
5.8.1 Windows Time(W32Time)
システムの時刻を正確に保つためのサービスです。
| 項目 | 内容 |
|---|---|
| サービス名 | W32Time |
| 表示名 | Windows Time |
| 役割 | NTPプロトコルによる時刻同期 |
| 使用ポート | UDP 123 |
| 重要性 | 認証(Kerberos)、ログ、証明書の有効期限など、多くの機能が正確な時刻に依存 |
[実行環境: PowerShell 7.4 (管理者)]
# Windows Timeサービスの状態確認
Get-Service -Name W32Time | Select-Object Name, Status, StartType
# 時刻同期の状態を確認
w32tm /query /status
5.8.2 Windows Update(wuauserv)
Windows Updateによるシステム更新を管理するサービスです。
| 項目 | 内容 |
|---|---|
| サービス名 | wuauserv |
| 表示名 | Windows Update |
| 役割 | 更新プログラムの検出、ダウンロード、インストール |
| スタートアップ | Manual(トリガー開始) |
このサービスは、更新の確認時に自動的に開始され、アイドル状態になると停止します。常時Runningである必要はありません。
5.8.3 Remote Desktop Services(TermService)
リモートデスクトップ接続を受け付けるサービスです。
| 項目 | 内容 |
|---|---|
| サービス名 | TermService |
| 表示名 | Remote Desktop Services |
| 役割 | RDP接続の受け付け |
| 使用ポート | TCP 3389 |
| 重要性 | VPSなどリモート管理が必須の環境では停止させてはならない |
警告:VPS環境でTermServiceを停止すると、リモートデスクトップ接続ができなくなり、サーバーにアクセスできなくなります。VPSプロバイダーのコンソール機能がない場合、復旧が困難になる可能性があります。
5.8.4 Windows Defender(WinDefend)
マルウェア対策を提供するサービスです。
| 項目 | 内容 |
|---|---|
| サービス名 | WinDefend |
| 表示名 | Microsoft Defender Antivirus Service |
| 役割 | リアルタイム保護、スキャン |
| 重要性 | セキュリティの基盤。特別な理由がない限り有効にしておく |
[実行環境: PowerShell 7.4 (管理者)]
# Windows Defenderサービスの状態確認
Get-Service -Name WinDefend | Select-Object Name, Status, StartType
5.8.5 DNS Client(Dnscache)
DNS名前解決の結果をキャッシュするサービスです。
| 項目 | 内容 |
|---|---|
| サービス名 | Dnscache |
| 表示名 | DNS Client |
| 役割 | DNS応答のキャッシュ、名前解決の高速化 |
| 重要性 | ネットワーク通信の基盤。停止すると名前解決が毎回行われ、パフォーマンスが低下 |
5.8.6 重要サービスの一括確認
上記の重要サービスの状態を一度に確認するスクリプトを作成しましょう。
[実行環境: PowerShell 7.4 (管理者)]
# 重要サービスの状態を一括確認
$criticalServices = @("W32Time", "wuauserv", "TermService", "WinDefend", "Dnscache", "EventLog", "WinRM")
foreach ($serviceName in $criticalServices) {
$service = Get-Service -Name $serviceName -ErrorAction SilentlyContinue
if ($service) {
$status = if ($service.Status -eq "Running") { "✓ Running" } else { "✗ $($service.Status)" }
Write-Host "$($service.DisplayName) ($serviceName): $status"
} else {
Write-Host "$serviceName: サービスが見つかりません" -ForegroundColor Yellow
}
}
実行結果の例:
Windows Time (W32Time): ✓ Running
Windows Update (wuauserv): ✗ Stopped
Remote Desktop Services (TermService): ✓ Running
Microsoft Defender Antivirus Service (WinDefend): ✓ Running
DNS Client (Dnscache): ✓ Running
Windows Event Log (EventLog): ✓ Running
Windows Remote Management (WS-Management) (WinRM): ✓ Running
5.9 サービス管理の実践
ここまで学んだ内容を組み合わせて、実践的なサービス監視スクリプトを作成しましょう。
5.9.1 サービス状態監視スクリプト
以下のスクリプトは、重要なサービスの状態を監視し、問題があれば警告を表示します。
[ファイル: C:\Scripts\Monitor-CriticalServices.ps1]
<#
.SYNOPSIS
重要なサービスの状態を監視し、レポートを出力します
.DESCRIPTION
指定された重要サービスの状態を確認し、
停止しているサービスがあれば警告を表示します。
.PARAMETER Services
監視するサービス名の配列
.PARAMETER AutoRestart
停止しているサービスを自動的に再起動するかどうか
.EXAMPLE
.\Monitor-CriticalServices.ps1
デフォルトの重要サービスを監視
.EXAMPLE
.\Monitor-CriticalServices.ps1 -AutoRestart
停止しているサービスを自動的に再起動
#>
param (
[string[]]$Services = @(
"W32Time", # Windows Time
"TermService", # Remote Desktop Services
"WinDefend", # Windows Defender
"Dnscache", # DNS Client
"EventLog", # Windows Event Log
"WinRM" # Windows Remote Management
),
[switch]$AutoRestart
)
# レポートヘッダー
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "サービス状態監視レポート" -ForegroundColor Cyan
Write-Host "実行日時: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""
# 問題のあるサービスを格納する配列
$problemServices = @()
# 各サービスを確認
foreach ($serviceName in $Services) {
try {
$service = Get-Service -Name $serviceName -ErrorAction Stop
if ($service.Status -eq "Running") {
Write-Host "[OK] " -ForegroundColor Green -NoNewline
Write-Host "$($service.DisplayName) ($serviceName)" -ForegroundColor White
}
elseif ($service.Status -eq "Stopped") {
Write-Host "[警告] " -ForegroundColor Yellow -NoNewline
Write-Host "$($service.DisplayName) ($serviceName) - 停止中" -ForegroundColor Yellow
$problemServices += $service
# 自動再起動オプションが有効な場合
if ($AutoRestart) {
Write-Host " → サービスを起動しています..." -ForegroundColor Cyan
try {
Start-Service -Name $serviceName -ErrorAction Stop
Write-Host " → 起動成功" -ForegroundColor Green
}
catch {
Write-Host " → 起動失敗: $($_.Exception.Message)" -ForegroundColor Red
}
}
}
else {
Write-Host "[注意] " -ForegroundColor Magenta -NoNewline
Write-Host "$($service.DisplayName) ($serviceName) - $($service.Status)" -ForegroundColor Magenta
$problemServices += $service
}
}
catch {
Write-Host "[エラー] " -ForegroundColor Red -NoNewline
Write-Host "$serviceName - サービスが見つかりません" -ForegroundColor Red
}
}
# サマリー
Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "サマリー" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "監視対象: $($Services.Count) サービス"
Write-Host "問題あり: $($problemServices.Count) サービス"
if ($problemServices.Count -gt 0) {
Write-Host ""
Write-Host "対応が必要なサービス:" -ForegroundColor Yellow
foreach ($ps in $problemServices) {
Write-Host " - $($ps.DisplayName) ($($ps.Name)): $($ps.Status)" -ForegroundColor Yellow
}
exit 1
}
else {
Write-Host ""
Write-Host "すべてのサービスが正常に動作しています。" -ForegroundColor Green
exit 0
}
このスクリプトを作成して実行してみましょう。
[実行環境: PowerShell 7.4 (管理者)]
# スクリプト用フォルダを作成
New-Item -Path C:\Scripts -ItemType Directory -Force
# スクリプトを実行(上記の内容をファイルに保存後)
C:\Scripts\Monitor-CriticalServices.ps1
実行結果の例:
========================================
サービス状態監視レポート
実行日時: 2025-01-20 14:30:45
========================================
[OK] Windows Time (W32Time)
[OK] Remote Desktop Services (TermService)
[OK] Microsoft Defender Antivirus Service (WinDefend)
[OK] DNS Client (Dnscache)
[OK] Windows Event Log (EventLog)
[OK] Windows Remote Management (WS-Management) (WinRM)
========================================
サマリー
========================================
監視対象: 6 サービス
問題あり: 0 サービス
すべてのサービスが正常に動作しています。
5.9.2 自動起動サービスの起動確認スクリプト
スタートアップの種類が「自動」なのに停止しているサービスを検出するスクリプトです。
[実行環境: PowerShell 7.4 (管理者)]
# 自動起動なのに停止しているサービスを検出
$stoppedAutoServices = Get-Service |
Where-Object { $_.StartType -eq "Automatic" -and $_.Status -ne "Running" }
if ($stoppedAutoServices.Count -gt 0) {
Write-Host "以下のサービスは自動起動に設定されていますが、停止しています:" -ForegroundColor Yellow
Write-Host ""
$stoppedAutoServices | ForEach-Object {
Write-Host "サービス名: $($_.Name)" -ForegroundColor Cyan
Write-Host "表示名: $($_.DisplayName)"
Write-Host "状態: $($_.Status)"
Write-Host "---"
}
Write-Host ""
Write-Host "合計: $($stoppedAutoServices.Count) 件" -ForegroundColor Yellow
}
else {
Write-Host "すべての自動起動サービスが正常に実行されています。" -ForegroundColor Green
}
補足:一部のサービスは「トリガー開始」として設定されており、特定の条件が満たされるまで停止しています(例:Windows Update)。これらは問題ではありません。サービスの役割を理解した上で判断することが重要です。
5.10 よくあるエラーと対処法
サービス管理でよく遭遇するエラーと、その対処法を紹介します。
5.10.1 サービスの起動に失敗する
| エラー内容 | 原因 | 対処法 |
|---|---|---|
| Service ‘xxx’ cannot be started due to the following error: Cannot start service xxx on computer ‘.’. | 依存サービスが停止、実行ファイルが存在しない、権限不足など | 依存サービスの状態確認、イベントログの確認、管理者権限での実行 |
| Cannot start service on computer ‘.’. | サービスが無効(Disabled)に設定されている | Set-Service -StartupType Manualでスタートアップの種類を変更してから起動 |
依存サービスの確認例:
# サービスが依存しているサービスを確認
Get-Service -Name "問題のあるサービス名" |
Select-Object -ExpandProperty ServicesDependedOn |
Select-Object Name, Status
5.10.2 サービスの停止に失敗する
| エラー内容 | 原因 | 対処法 |
|---|---|---|
| Cannot stop service ‘xxx’ because it has dependent services. | このサービスに依存している他のサービスがある | Stop-Service -Forceで依存サービスも含めて停止、または依存サービスを先に停止 |
| Service ‘xxx’ cannot be stopped due to the following error: The service cannot accept control messages at this time. | サービスがハングしている、または処理中 | しばらく待つ、またはプロセスを強制終了(taskkill /F) |
5.10.3 イベントログでの調査
サービスの問題を調査する際は、イベントログを確認することが重要です。
[実行環境: PowerShell 7.4 (管理者)]
# サービス関連のエラーイベントを確認(直近24時間)
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Level = 2 # Error
StartTime = (Get-Date).AddHours(-24)
} | Where-Object { $_.Message -like "*service*" } |
Select-Object TimeCreated, Id, Message -First 10
5.11 まとめ
第5回では、以下の内容を学びました。
- Windowsサービスの概念
- サービスはバックグラウンドで動作し、ユーザーログオンなしで実行される
- Linuxのデーモンに相当する概念
- サービス間には依存関係があり、起動順序や停止時の影響に注意が必要
- サービスの状態確認
Get-Serviceでサービス一覧と状態を確認-Nameで特定サービスを指定、-DisplayNameで表示名検索- PowerShell 7.4では
StartType、UserName、Descriptionなどの追加プロパティが利用可能 DependentServicesとServicesDependedOnで依存関係を確認
- サービスの起動・停止・再起動
Start-Serviceで起動、Stop-Serviceで停止、Restart-Serviceで再起動-Forceで依存サービスも含めて停止-WhatIfで事前確認、-Confirmで確認プロンプト表示
- サービスの設定変更
Set-Serviceでスタートアップの種類や説明を変更- スタートアップの種類:Automatic、AutomaticDelayedStart、Manual、Disabled
- CIM/WMIによる詳細情報取得
Get-CimInstance Win32_Serviceで詳細情報を取得- 実行パス、ログオンアカウント、プロセスIDなどを確認可能
- 重要なシステムサービス
- W32Time(時刻同期)、TermService(リモートデスクトップ)、WinDefend(セキュリティ)、Dnscache(DNS)など
- これらのサービスの役割と重要性を理解
- サービス管理の実践
- サービス状態監視スクリプトの作成
- 自動起動サービスの起動確認
サービスの管理は、Windows Server管理の基本中の基本です。日常的な運用監視からトラブルシューティングまで、幅広い場面で今回学んだスキルを活用してください。
5.12 次回予告
第6回では「ネットワーク設定の基礎 ― IPアドレスとDNSを理解する」と題して、TCP/IPの基本概念、IPアドレスとサブネットマスクの設定、DNS設定、接続テストの方法を学びます。サーバーがネットワーク上で通信するための基盤となる知識を習得しましょう。
