WindowsServer 2025 総合ガイド 第05回

記事内に広告が含まれています。

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を使用する必要がありました。

依存関係の確認

サービスの依存関係は、DependentServicesServicesDependedOnプロパティで確認できます。

# サービスが依存している他のサービス(このサービスの起動に必要)
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

CanPauseAndContinueTrueのサービスのみ、一時停止と再開が可能です。

# 一時停止をサポートするサービスを検索
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-ServiceGet-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ではStartTypeUserNameDescriptionなどの追加プロパティが利用可能
    • DependentServicesServicesDependedOnで依存関係を確認
  • サービスの起動・停止・再起動
    • 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設定、接続テストの方法を学びます。サーバーがネットワーク上で通信するための基盤となる知識を習得しましょう。

5.13 参考リンク

Windows Server