PR

WindowsServer 2025 総合ガイド 第10回

WindowsServer 2025 総合ガイド 第10回
役割・機能の管理とタスクスケジューラ

第9回では、OpenSSHとPowerShellリモーティング(WinRM)を使ったリモート管理の方法を学びました。第10回となる今回は、Windows Serverの「役割」と「機能」の管理、Windows Updateの運用、そしてタスクスケジューラによる定期的なタスクの自動実行について学びます。サーバーにどのような役割を持たせるか、どのような機能を追加するかはサーバー構築の根幹に関わる部分です。さらに、日々の運用で必要となるメンテナンス作業を自動化するためのタスクスケジューラの活用方法を、基礎から実践的に習得していきましょう。

10.1 この記事で学ぶこと

  • Windows Serverの「役割(Role)」と「機能(Feature)」の違いを理解する
  • Get-WindowsFeature で役割・機能の一覧を確認し、Install-WindowsFeature / Uninstall-WindowsFeature で追加・削除ができる
  • PSWindowsUpdateモジュールを使って、PowerShellからWindows Updateを管理できる
  • タスクスケジューラの仕組みを理解し、PowerShellで定期実行タスクを作成・管理できる
  • 実務で使えるタスク(ログバックアップ、サービス監視、ディスク容量レポート)を作成できる

10.2 前提条件

  • 第9回完了(リモート管理の基礎を理解している状態)
  • Windows Server 2025にリモートデスクトップ接続できる状態
  • PowerShell 7.4を管理者として起動できる状態
  • 基本的なPowerShellスクリプティングができる状態(第4回の内容)

10.3 役割と機能の概念

Windows Serverには、サーバーの用途に応じて追加できる「役割」と「機能」という仕組みがあります。Windows 10やWindows 11のようなクライアントOSでは、OSをインストールした時点でほとんどの機能が利用可能ですが、サーバーOSでは必要なものだけを選択して追加するという設計になっています。これは、不要なコンポーネントを減らすことでセキュリティリスクを低減し、システムリソースを効率的に使うためです。

10.3.1 役割(Role)とは

「役割」とは、サーバーの主要な機能、つまり「そのサーバーが何をするか」を定義するものです。1台のサーバーに複数の役割を持たせることも可能ですが、実務ではセキュリティと安定性の観点から、1台につき1〜2つの役割に限定することが推奨されています。

代表的な役割には以下のようなものがあります。

役割名 内部名 用途
Web Server (IIS) Web-Server Webサイトやアプリケーションをホストする
DNS Server DNS ドメイン名とIPアドレスの名前解決を行う
DHCP Server DHCP ネットワーク内の端末にIPアドレスを自動的に割り当てる
Active Directory Domain Services AD-Domain-Services ドメイン環境でユーザーやコンピューターを一元管理する
File and Storage Services FileAndStorage-Services ファイル共有やストレージの管理を行う

10.3.2 機能(Feature)とは

「機能」とは、役割を補完する追加のコンポーネントです。役割が「サーバーの主な仕事」を定義するのに対し、機能は「その仕事を支える道具」や「追加の便利機能」にあたります。機能は特定の役割に依存しないものが多く、さまざまな用途に活用できます。

代表的な機能には以下のようなものがあります。

機能名 内部名 用途
.NET Framework 4.8 NET-Framework-45-Features .NETアプリケーションの実行に必要なランタイム
Telnet Client Telnet-Client ネットワーク接続のテスト・デバッグ用のクライアント
Windows Server Backup Windows-Server-Backup サーバーのバックアップと復元を行うツール
SNMP Service SNMP-Service ネットワーク機器の監視に使用するプロトコルのサービス
BitLocker Drive Encryption BitLocker ディスクの暗号化によるデータ保護

10.3.3 役割と機能の違い

役割と機能の違いを整理すると、以下のようになります。

項目 役割(Role) 機能(Feature)
位置づけ サーバーの主要な用途を定義 役割を補完する追加コンポーネント
例え 「職種」(Webサーバー、DNSサーバー) 「スキル・道具」(バックアップ、暗号化)
依存関係 関連するサブ機能を含むことが多い 特定の役割に依存しないものが多い
管理ツール 役割専用の管理ツールが付属することが多い 管理ツールが付属するものは少ない

補足: 実際のところ、Windows Serverの内部では役割と機能は同じ仕組み(ServerManagerモジュール)で管理されています。Get-WindowsFeature コマンドレットで一覧表示すると、役割も機能もまとめて表示されます。「役割」と「機能」の区別はサーバーマネージャーのGUIでのカテゴリ分けが主な違いであり、PowerShellからの操作は同じコマンドレットで行えます。

10.4 役割と機能の確認

10.4.1 Get-WindowsFeature コマンドレット

Get-WindowsFeature は、サーバーにインストール可能な役割・機能の一覧を表示するコマンドレットです。このコマンドレットはServerManagerモジュールに含まれており、Windows Server環境で使用できます。

PowerShell 7.4での注意点: Get-WindowsFeature はPowerShell 7.4でも動作しますが、表示のフォーマットに一部制限があり、一部のプロパティ(Install State 列など)がデフォルトの表示で空欄になることがあります。これは表示上の問題であり、オブジェクトのプロパティ自体は正しく取得されています。Select-Object でプロパティを明示的に指定すれば、正確な情報を確認できます。

全機能の一覧表示

[実行環境: PowerShell 7.4 (管理者)]

# 役割・機能の全一覧を表示
Get-WindowsFeature

出力例(抜粋):

Display Name                                            Name                       Install State
------------                                            ----                       -------------
[ ] Active Directory Domain Services                    AD-Domain-Services             Available
[ ] Active Directory Federation Services                ADFS-Federation                Available
[ ] Active Directory Lightweight Directory Services     ADLDS                          Available
[X] File and Storage Services                           FileAndStorage-Services         Installed
    [X] Storage Services                                Storage-Services               Installed
[ ] Network Policy and Access Services                  NPAS                           Available
[ ] Web Server (IIS)                                    Web-Server                     Available
[X] .NET Framework 4.8 Features                         NET-Framework-45-Features      Installed
[ ] Windows Server Backup                               Windows-Server-Backup          Available

出力の見方は以下のとおりです。

表記 意味
[X] インストール済み
[ ] 利用可能(未インストール)
インデント付き 親の役割・機能のサブ機能

インストール済み機能の確認

現在インストールされている役割・機能だけを一覧表示するには、Where-Object でフィルタリングします。

[実行環境: PowerShell 7.4 (管理者)]

# インストール済みの役割・機能のみを表示
Get-WindowsFeature |
    Where-Object { $_.InstallState -eq "Installed" } |
    Select-Object -Property DisplayName, Name, InstallState

出力例:

DisplayName                     Name                        InstallState
-----------                     ----                        ------------
File and Storage Services       FileAndStorage-Services         Installed
Storage Services                Storage-Services               Installed
.NET Framework 4.8 Features     NET-Framework-45-Features      Installed
.NET Framework 4.8              NET-Framework-45-Core          Installed
WCF Services                    NET-WCF-Services45             Installed
TCP Port Sharing                NET-WCF-TCP-PortSharing45      Installed
Windows PowerShell              PowerShellRoot                 Installed
Windows PowerShell 5.1          PowerShell                     Installed

特定の機能を検索

機能名で検索するには、-Name パラメータにワイルドカード(*)を使用します。

[実行環境: PowerShell 7.4 (管理者)]

# "Web" を含む機能を検索
Get-WindowsFeature -Name Web-* |
    Select-Object -Property DisplayName, Name, InstallState

出力例:

DisplayName                                 Name                    InstallState
-----------                                 ----                    ------------
Web Server (IIS)                            Web-Server                 Available
Web Server                                  Web-WebServer              Available
Common HTTP Features                        Web-Common-Http            Available
Default Document                            Web-Default-Doc            Available
Directory Browsing                          Web-Dir-Browsing           Available
HTTP Errors                                 Web-Http-Errors            Available
Static Content                              Web-Static-Content         Available
...

10.4.2 機能の依存関係の確認

役割や機能には「依存関係」があるものがあります。たとえば、Web Server (IIS) をインストールすると、内部的に必要なサブ機能も一緒にインストールされます。依存関係を確認するには、特定の機能のプロパティを表示します。

[実行環境: PowerShell 7.4 (管理者)]

# Web-Server の詳細情報を確認(依存関係を含む)
Get-WindowsFeature -Name Web-Server |
    Select-Object -Property DisplayName, Name, InstallState, DependsOn, SubFeatures

出力例:

DisplayName  : Web Server (IIS)
Name         : Web-Server
InstallState : Available
DependsOn    : {}
SubFeatures  : {Web-WebServer, Web-Ftp-Server, Web-Mgmt-Tools}

SubFeatures に含まれるのが、この役割に属するサブ機能です。また、DependsOn にはこの機能が依存する他の機能が表示されます。

10.5 役割と機能の追加

10.5.1 Install-WindowsFeature コマンドレット

Install-WindowsFeature は、役割・機能をインストールするコマンドレットです。サーバーマネージャーのGUIで「役割と機能の追加ウィザード」を使って行う操作を、コマンドラインから実行できます。

基本構文は以下のとおりです。

Install-WindowsFeature -Name <機能の内部名> [-IncludeManagementTools] [-IncludeAllSubFeature] [-Restart]

主要なパラメータを確認しましょう。

パラメータ 説明
-Name インストールする機能の内部名(Get-WindowsFeature で確認した Name 列の値)
-IncludeManagementTools 管理ツール(MMCスナップインやPowerShellモジュール等)も一緒にインストールする
-IncludeAllSubFeature すべてのサブ機能も含めてインストールする
-Restart インストール後に再起動が必要な場合、自動的に再起動する

重要: -IncludeManagementTools について
GUIの「役割と機能の追加ウィザード」では管理ツールがデフォルトでインストールされますが、Install-WindowsFeature コマンドレットでは管理ツールはデフォルトではインストールされません。管理ツールがないとGUIベースでの管理や、関連するPowerShellモジュールが使えなくなるため、特に理由がない限り -IncludeManagementTools を付けることを推奨します。

10.5.2 実践例:Web Server (IIS) のインストール

IIS(Internet Information Services)は、Windows Serverで最も広く使われるWebサーバーの役割です。ここでは、基本的なIISのインストールを行います。

インストール前の確認

まず、IISがインストールされていないことを確認します。

[実行環境: PowerShell 7.4 (管理者)]

# IISのインストール状態を確認
Get-WindowsFeature -Name Web-Server |
    Select-Object -Property DisplayName, Name, InstallState

出力例:

DisplayName      Name       InstallState
-----------      ----       ------------
Web Server (IIS) Web-Server    Available

InstallStateAvailable であれば、まだインストールされていない状態です。

IISのインストール

[実行環境: PowerShell 7.4 (管理者)]

# IISを管理ツール付きでインストール
Install-WindowsFeature -Name Web-Server -IncludeManagementTools

出力例:

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    No             Success        {Common HTTP Features, Default Document, ...}

出力の各列の意味は以下のとおりです。

列名 説明
Success True ならインストール成功
Restart Needed 再起動が必要かどうか(No なら不要)
Exit Code インストール結果のコード
Feature Result インストールされた機能の一覧

インストール後の確認

[実行環境: PowerShell 7.4 (管理者)]

# IISのインストール状態を再確認
Get-WindowsFeature -Name Web-Server |
    Select-Object -Property DisplayName, Name, InstallState

出力例:

DisplayName      Name       InstallState
-----------      ----       ------------
Web Server (IIS) Web-Server    Installed

Installed に変わっていれば、インストール完了です。IISのデフォルトページが表示されるか、ブラウザで http://localhost にアクセスして確認することもできます。

10.5.3 実践例:Windows Server Backup のインストール

Windows Server Backup は、サーバーのバックアップと復元を行うための機能です。応用編(第15回)のバックアップの基礎でも使用しますので、ここでインストールしておきましょう。

[実行環境: PowerShell 7.4 (管理者)]

# Windows Server Backup のインストール
Install-WindowsFeature -Name Windows-Server-Backup

出力例:

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    No             Success        {Windows Server Backup}

10.5.4 実践例:Telnet クライアントのインストール

Telnet クライアントは、ネットワーク接続のテストやデバッグに使われるツールです。たとえば、特定のサーバーの特定ポートに接続できるかを確認する際に利用します。

注意: Telnetプロトコル自体は通信が暗号化されないため、リモート管理には使用しません。ここでインストールするのはあくまで「クライアント」であり、接続テスト目的で使用します。

[実行環境: PowerShell 7.4 (管理者)]

# Telnet クライアントのインストール
Install-WindowsFeature -Name Telnet-Client

出力例:

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    No             Success        {Telnet Client}

10.5.5 再起動が必要な場合の対応

一部の役割・機能のインストールでは、再起動が必要になる場合があります。Install-WindowsFeature の結果で Restart NeededYes と表示された場合は、再起動を行う必要があります。

再起動が必要かどうかを事前に確認する

-WhatIf パラメータを使うと、実際にはインストールを行わずに、何が起こるかを確認できます。

[実行環境: PowerShell 7.4 (管理者)]

# IISの全サブ機能をインストールした場合の動作を確認(実行はしない)
Install-WindowsFeature -Name Web-Server -IncludeAllSubFeature -IncludeManagementTools -WhatIf

保留中の再起動の確認

機能のインストール後に再起動が保留されているかどうかは、レジストリで確認できます。

[実行環境: PowerShell 7.4 (管理者)]

# 保留中の再起動があるか確認
$rebootPending = Test-Path -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending"
if ($rebootPending) {
    Write-Host "再起動が保留されています。サーバーを再起動してください。" -ForegroundColor Yellow
} else {
    Write-Host "保留中の再起動はありません。" -ForegroundColor Green
}

自動再起動オプション

計画的なメンテナンス時間帯であれば、-Restart パラメータを付けてインストールと同時に再起動することもできます。

[実行環境: PowerShell 7.4 (管理者)]

# 機能のインストール後に自動で再起動(必要な場合のみ)
Install-WindowsFeature -Name <機能名> -IncludeManagementTools -Restart

注意: -Restart パラメータを使うと、再起動が必要な場合に即座にサーバーが再起動されます。本番環境では利用者への影響を考慮し、計画的なメンテナンス時間帯にのみ使用してください。

10.6 役割と機能の削除

10.6.1 Uninstall-WindowsFeature コマンドレット

不要になった役割・機能は Uninstall-WindowsFeature で削除できます。基本構文は Install-WindowsFeature と似ています。

[実行環境: PowerShell 7.4 (管理者)]

# Telnet クライアントの削除
Uninstall-WindowsFeature -Name Telnet-Client

出力例:

Success Restart Needed Exit Code      Feature Result
------- -------------- ---------      --------------
True    No             Success        {Telnet Client}

10.6.2 削除時の注意点

機能の削除にあたっては、以下の点に注意してください。

  • 依存関係: 他の機能から依存されている機能を削除しようとすると、警告が表示されます。依存する機能も合わせて削除するかどうかを判断する必要があります
  • 再起動: 一部の機能は削除時にも再起動が必要です。Restart Needed 列を確認してください
  • データの消失: 役割を削除すると、その役割に関連する設定やデータが失われる場合があります。削除前にバックアップを取ることを推奨します
  • 事前確認: 削除前に -WhatIf パラメータで影響範囲を確認しましょう

[実行環境: PowerShell 7.4 (管理者)]

# 削除前に影響範囲を確認(実行はしない)
Uninstall-WindowsFeature -Name Web-Server -WhatIf

Tips: 今回の学習ではIISを後の回でも使用しますので、IISは削除せずそのままにしておいてください。

10.7 Windows Updateの管理

10.7.1 Windows Updateの仕組み

Windows Updateは、Microsoftからセキュリティ修正プログラムや機能改善を自動的に取得・適用する仕組みです。サーバーの安定運用とセキュリティ維持のために、定期的な更新は不可欠です。

更新プログラムの種類

種類 説明 頻度
セキュリティ更新プログラム 脆弱性を修正する重要なパッチ 毎月第2火曜日(日本時間は翌水曜日)
累積更新プログラム 過去のすべてのセキュリティ修正と品質改善を含む 毎月
機能更新プログラム 新しい機能やOSの改善を含む大型アップデート 不定期
ドライバー更新 ハードウェアドライバーの更新 随時
定義更新 Windows Defenderのウイルス定義ファイルの更新 毎日複数回

Windows Serverでは、毎月リリースされる「累積更新プログラム(Cumulative Update)」が最も重要です。累積更新プログラムには、リリース以降のすべてのセキュリティ修正と品質改善が含まれているため、最新の累積更新プログラムを1つ適用するだけで、過去の修正もすべて反映されます。

10.7.2 PSWindowsUpdate モジュール

Windows ServerのWindows UpdateをPowerShellから管理するには、コミュニティ製の PSWindowsUpdate モジュールが広く利用されています。このモジュールを使うことで、更新プログラムの確認・ダウンロード・インストールをコマンドラインから効率的に行えます。

PSWindowsUpdate のインストール

PSWindowsUpdate は PowerShell Gallery からインストールします。

[実行環境: PowerShell 7.4 (管理者)]

# PSWindowsUpdate モジュールのインストール
Install-Module -Name PSWindowsUpdate -Force -Scope AllUsers

初回実行時に「信頼されていないリポジトリからのインストール」を確認するプロンプトが表示される場合があります。Y を入力して続行してください。

# インストール確認
Get-Module -Name PSWindowsUpdate -ListAvailable |
    Select-Object -Property Name, Version

出力例:

Name              Version
----              -------
PSWindowsUpdate   2.2.1.5
# モジュールの読み込み
Import-Module -Name PSWindowsUpdate

# 利用可能なコマンドレットの一覧
Get-Command -Module PSWindowsUpdate | Select-Object -Property Name

更新プログラムの確認

Get-WindowsUpdate で、利用可能な更新プログラムを確認できます。

[実行環境: PowerShell 7.4 (管理者)]

# 利用可能な更新プログラムを確認
Get-WindowsUpdate

出力例:

ComputerName Status     KB          Size Title
------------ ------     --          ---- -----
SERVER-01    -------    KB5043080   450MB 2025-01 Cumulative Update for Microsoft server oper...
SERVER-01    -------    KB5041948    17MB 2025-01 .NET Framework 3.5, 4.8 and 4.8.1 Cumulati...

Status 列のフラグの意味は以下のとおりです。

フラグ 意味
D ダウンロード済み
I インストール済み
H 非表示(Hidden)
- 未ダウンロード / 未インストール

更新プログラムのインストール

[実行環境: PowerShell 7.4 (管理者)]

# すべての更新プログラムをインストール(自動承認、再起動なし)
Install-WindowsUpdate -AcceptAll -IgnoreReboot

-AcceptAll は利用可能なすべての更新を承認し、-IgnoreReboot は再起動が必要でも自動再起動を行わないオプションです。

注意: 本番環境では -AcceptAll ですべての更新を無条件に適用するのではなく、テスト環境で事前に検証してから適用することが推奨されます。更新プログラムが既存のアプリケーションに影響を与える可能性があるためです。

10.7.3 更新履歴の確認

過去にインストールされた更新プログラムの履歴を確認できます。

[実行環境: PowerShell 7.4 (管理者)]

# 更新履歴を確認(直近10件)
Get-WUHistory -MaxDate (Get-Date) -Last 10 |
    Select-Object -Property Date, Title, Result |
    Format-Table -AutoSize

出力例:

Date                  Title                                                       Result
----                  -----                                                       ------
2025-01-15 3:27:15 AM 2025-01 Cumulative Update for Microsoft server operating... Succeeded
2025-01-10 2:15:30 AM Security Intelligence Update for Microsoft Defender Ant... Succeeded

PSWindowsUpdate を使わない場合でも、標準コマンドで直近の更新履歴を確認できます。

[実行環境: PowerShell 7.4 (管理者)]

# 標準コマンドで直近の更新プログラムを確認(HotFix)
Get-HotFix | Sort-Object -Property InstalledOn -Descending |
    Select-Object -First 10 -Property HotFixID, Description, InstalledOn

出力例:

HotFixID   Description     InstalledOn
--------   -----------     -----------
KB5043080  Update          2025/01/15 0:00:00
KB5041160  Security Update 2025/01/10 0:00:00
KB5031539  Update          2024/12/20 0:00:00

10.7.4 再起動の管理

更新プログラムの適用後に再起動が必要かどうかを確認し、計画的に再起動を行うことが重要です。

保留中の再起動の確認

[実行環境: PowerShell 7.4 (管理者)]

# PSWindowsUpdate を使った再起動保留状態の確認
Get-WURebootStatus

出力例(再起動不要の場合):

ComputerName RebootRequired
------------ ---------------
SERVER-01    False

計画的な再起動

再起動が必要な場合は、業務への影響が少ない時間帯(メンテナンスウィンドウ)に再起動を行います。

[実行環境: PowerShell 7.4 (管理者)]

# 即座に再起動(確認プロンプトあり)
Restart-Computer -Confirm

# 指定時刻に再起動をスケジュール(タスクスケジューラを使用 ― 詳細は後述)

実務でのポイント: Windows Updateの適用と再起動は、多くの組織で「パッチチューズデー(Patch Tuesday)」と呼ばれる月例パッチの適用日に合わせて計画されています。Microsoftは毎月第2火曜日(米国時間)にセキュリティ更新プログラムをリリースします。

10.8 タスクスケジューラの基礎

10.8.1 タスクスケジューラとは

タスクスケジューラ(Task Scheduler)は、Windowsに組み込まれたジョブスケジューリングの仕組みです。指定した時刻やイベントをトリガーとして、プログラムやスクリプトを自動的に実行できます。

サーバー運用では、以下のような用途でタスクスケジューラが活用されています。

  • 定期的なログファイルのバックアップ・ローテーション
  • ディスク容量の監視とレポート送信
  • サービスの死活監視と自動再起動
  • 深夜のメンテナンス処理(不要ファイルの削除、データベースの最適化など)
  • Windows Updateの定期的な確認

Linux の cron との比較

Linux経験者のために、Linux環境で定期実行に使われる cron との簡単な比較を示します。

項目 タスクスケジューラ cron
設定方法 GUI / PowerShell / XML crontabファイル(テキスト)
トリガー種類 時刻、イベント、ログオン、起動時など 時刻ベースのみ
実行ユーザー 詳細な指定が可能 ユーザーごとのcrontab
条件設定 アイドル時、AC電源時など 基本的になし
実行履歴 GUIで確認可能 ログファイルで確認

タスクスケジューラは cron よりも多機能で、時刻以外のトリガー(イベント発生時やシステム起動時など)にも対応しています。

10.8.2 タスクの構成要素

タスクスケジューラのタスクは、以下の4つの要素で構成されています。

構成要素 英語名 説明 対応するコマンドレット
トリガー Trigger いつ実行するか(スケジュールやイベント) New-ScheduledTaskTrigger
操作 Action 何を実行するか(プログラムやスクリプト) New-ScheduledTaskAction
プリンシパル Principal 誰の権限で実行するか(実行ユーザー) New-ScheduledTaskPrincipal
設定 Settings 実行時の動作設定(タイムアウト、再試行など) New-ScheduledTaskSettingsSet

この4つの要素を組み合わせてタスクを定義し、Register-ScheduledTask でシステムに登録します。

10.9 タスクの確認

10.9.1 Get-ScheduledTask コマンドレット

Get-ScheduledTask で、システムに登録されているタスクの一覧を確認できます。

全タスクの一覧

[実行環境: PowerShell 7.4 (管理者)]

# ルートフォルダのタスク一覧を表示
Get-ScheduledTask -TaskPath "\" |
    Select-Object -Property TaskName, State |
    Format-Table -AutoSize

出力例:

TaskName                          State
--------                          -----
CreateExplorerShellUnelevatedTask Ready
MicrosoftEdgeUpdateTaskMachineCore Ready

特定フォルダのタスク一覧

タスクスケジューラはフォルダ構造で管理されています。Windowsのシステムタスクは \Microsoft\Windows\ 配下にあります。

[実行環境: PowerShell 7.4 (管理者)]

# Windows Update 関連のタスクを確認
Get-ScheduledTask -TaskPath "\Microsoft\Windows\WindowsUpdate\" |
    Select-Object -Property TaskName, State |
    Format-Table -AutoSize

出力例:

TaskName               State
--------               -----
Scheduled Start        Ready

特定タスクの検索

[実行環境: PowerShell 7.4 (管理者)]

# タスク名でワイルドカード検索
Get-ScheduledTask -TaskName "*Update*" |
    Select-Object -Property TaskPath, TaskName, State |
    Format-Table -AutoSize

10.9.2 Get-ScheduledTaskInfo コマンドレット

Get-ScheduledTaskInfo は、タスクの実行履歴情報を取得するコマンドレットです。最終実行時刻や次回実行時刻、実行結果を確認できます。

[実行環境: PowerShell 7.4 (管理者)]

# 特定タスクの実行情報を確認
Get-ScheduledTask -TaskName "Scheduled Start" -TaskPath "\Microsoft\Windows\WindowsUpdate\" |
    Get-ScheduledTaskInfo

出力例:

LastRunTime        : 2025-01-20 3:00:00 AM
LastTaskResult     : 0
NextRunTime        : 2025-01-21 3:00:00 AM
NumberOfMissedRuns : 0
TaskName           : Scheduled Start
TaskPath           : \Microsoft\Windows\WindowsUpdate\
PSComputerName     :

出力の主な項目は以下のとおりです。

項目 説明
LastRunTime 最後に実行された日時
LastTaskResult 最後の実行結果コード(0 は成功)
NextRunTime 次回の実行予定日時
NumberOfMissedRuns 実行が予定されていたが実行されなかった回数

Tips: LastTaskResult の値が 0 であれば正常終了です。2670110x00041303)は「タスクはまだ実行されていない」を意味し、2670090x00041301)は「タスクは現在実行中」を意味します。

10.10 タスクの作成

タスクの作成は、以下のステップで行います。

  1. トリガーの作成(New-ScheduledTaskTrigger
  2. 操作(アクション)の作成(New-ScheduledTaskAction
  3. プリンシパル(実行ユーザー)の作成(New-ScheduledTaskPrincipal
  4. タスクの登録(Register-ScheduledTask

10.10.1 トリガーの作成

New-ScheduledTaskTrigger で、タスクを「いつ実行するか」を定義します。さまざまなスケジュールパターンに対応しています。

[実行環境: PowerShell 7.4 (管理者)]

# 毎日午前3時に実行
$triggerDaily = New-ScheduledTaskTrigger -Daily -At "03:00"

# 毎週月曜日の午前5時に実行
$triggerWeekly = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At "05:00"

# サーバー起動時に実行
$triggerAtStartup = New-ScheduledTaskTrigger -AtStartup

# ユーザーログオン時に実行
$triggerAtLogon = New-ScheduledTaskTrigger -AtLogon

# 1回限り、指定日時に実行
$triggerOnce = New-ScheduledTaskTrigger -Once -At "2025-02-01T10:00:00"

10.10.2 操作(アクション)の作成

New-ScheduledTaskAction で、タスクが「何を実行するか」を定義します。

PowerShell 7.4のスクリプトを実行する場合は、pwsh.exe のフルパスを指定します。

[実行環境: PowerShell 7.4 (管理者)]

# PowerShell 7.4 でスクリプトを実行するアクション
$action = New-ScheduledTaskAction `
    -Execute "C:\Program Files\PowerShell\7\pwsh.exe" `
    -Argument '-NoProfile -NonInteractive -ExecutionPolicy Bypass -File "C:\Scripts\MyScript.ps1"'

各引数の意味は以下のとおりです。

引数 説明
-Execute 実行するプログラムのパス。PowerShell 7.4の場合は C:\Program Files\PowerShell\7\pwsh.exe
-Argument プログラムに渡す引数。スクリプトのパスや実行オプションを指定

-Argument に指定しているPowerShellオプションの意味は以下のとおりです。

オプション 説明
-NoProfile プロファイルスクリプトを読み込まない(起動を高速化し、環境依存を排除)
-NonInteractive 対話的な入力プロンプトを表示しない(無人実行で停止しない)
-ExecutionPolicy Bypass スクリプトの実行ポリシーを無視する(タスク実行時の制限を回避)
-File 実行するスクリプトファイルのパス

重要: pwsh.exe のパスについて
PowerShell 7.4を winget やMSIインストーラーでインストールした場合、実行ファイルのパスは C:\Program Files\PowerShell\7\pwsh.exe です。Microsoft Store からインストールした場合はパスが異なりますので注意してください。タスクスケジューラにはフルパスで指定することを推奨します。

10.10.3 プリンシパル(実行ユーザー)の作成

New-ScheduledTaskPrincipal で、タスクを「誰の権限で実行するか」を定義します。

[実行環境: PowerShell 7.4 (管理者)]

# SYSTEM アカウントで最高権限で実行(ログオンしていなくても実行可能)
$principal = New-ScheduledTaskPrincipal `
    -UserID "NT AUTHORITY\SYSTEM" `
    -LogonType ServiceAccount `
    -RunLevel Highest

主なパラメータの意味は以下のとおりです。

パラメータ 説明
-UserID タスクを実行するユーザーアカウント
-LogonType ログオンの種類。ServiceAccount はサービスアカウント用
-RunLevel 実行レベル。Highest は管理者権限で実行

よく使うプリンシパルの設定パターンを紹介します。

パターン UserID LogonType 用途
SYSTEMアカウント NT AUTHORITY\SYSTEM ServiceAccount システムレベルの管理タスク
特定の管理者ユーザー Administrator Password ユーザーコンテキストが必要なタスク
ログオン中のユーザー BUILTIN\Users InteractiveToken ユーザーがログオン中にのみ実行するタスク

10.10.4 タスクの登録

トリガー、アクション、プリンシパルを組み合わせて、Register-ScheduledTask でタスクを登録します。

[実行環境: PowerShell 7.4 (管理者)]

# タスクの構成要素を作成
$trigger = New-ScheduledTaskTrigger -Daily -At "03:00"
$action = New-ScheduledTaskAction `
    -Execute "C:\Program Files\PowerShell\7\pwsh.exe" `
    -Argument '-NoProfile -NonInteractive -ExecutionPolicy Bypass -File "C:\Scripts\MyScript.ps1"'
$principal = New-ScheduledTaskPrincipal `
    -UserID "NT AUTHORITY\SYSTEM" `
    -LogonType ServiceAccount `
    -RunLevel Highest

# タスクを登録
Register-ScheduledTask `
    -TaskName "MyDailyTask" `
    -Trigger $trigger `
    -Action $action `
    -Principal $principal `
    -Description "毎日午前3時にスクリプトを実行するタスク"

出力例:

TaskPath TaskName     State
-------- --------     -----
\        MyDailyTask  Ready

StateReady であれば、タスクは正常に登録され、次回のトリガー時刻に実行されます。

10.11 タスクの管理

10.11.1 タスクの有効化と無効化

登録済みのタスクを一時的に無効にしたり、再度有効にしたりできます。

[実行環境: PowerShell 7.4 (管理者)]

# タスクを無効化
Disable-ScheduledTask -TaskName "MyDailyTask"

出力例:

TaskPath TaskName     State
-------- --------     -----
\        MyDailyTask  Disabled
# タスクを有効化
Enable-ScheduledTask -TaskName "MyDailyTask"

出力例:

TaskPath TaskName     State
-------- --------     -----
\        MyDailyTask  Ready

10.11.2 タスクの即時実行

次のトリガー時刻を待たずに、タスクを手動で即座に実行できます。動作確認に便利です。

[実行環境: PowerShell 7.4 (管理者)]

# タスクを即時実行
Start-ScheduledTask -TaskName "MyDailyTask"

# 実行結果を確認
Get-ScheduledTask -TaskName "MyDailyTask" | Get-ScheduledTaskInfo

10.11.3 タスクの削除

不要になったタスクは Unregister-ScheduledTask で削除します。

[実行環境: PowerShell 7.4 (管理者)]

# タスクを削除(確認プロンプトあり)
Unregister-ScheduledTask -TaskName "MyDailyTask" -Confirm:$true

確認プロンプトが表示されるので、Y を入力して削除を確定します。確認なしで削除する場合は -Confirm:$false を指定します。

10.12 実践例

ここでは、実務で活用できる3つのタスクを実際に作成します。それぞれ、スクリプトの作成からタスクの登録、動作確認までの手順を示します。

10.12.1 毎日深夜にログをバックアップするタスク

アプリケーションやシステムが出力するログファイルを、毎日深夜に日付付きのフォルダへバックアップするタスクを作成します。

スクリプトの作成

まず、スクリプト格納用のフォルダを作成します。

[実行環境: PowerShell 7.4 (管理者)]

# スクリプト格納フォルダの作成
New-Item -Path "C:\Scripts" -ItemType Directory -Force
New-Item -Path "C:\Logs" -ItemType Directory -Force
New-Item -Path "C:\Backup\Logs" -ItemType Directory -Force

次に、バックアップスクリプトを作成します。

[ファイル: C:\Scripts\Backup-Logs.ps1]

# ========================================
# ログバックアップスクリプト
# 実行環境: PowerShell 7.4
# 用途: C:\Logs 配下のログファイルを日付付きフォルダにバックアップ
# ========================================

# パラメータ定義
$sourcePath = "C:\Logs"
$backupRoot = "C:\Backup\Logs"
$date = Get-Date -Format "yyyyMMdd"
$backupPath = Join-Path -Path $backupRoot -ChildPath $date
$logFile = Join-Path -Path $backupRoot -ChildPath "backup-log.txt"

# バックアップ開始のログ出力
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Add-Content -Path $logFile -Value "[$timestamp] バックアップ開始: $sourcePath -> $backupPath"

try {
    # バックアップ先フォルダの作成
    if (-not (Test-Path -Path $backupPath)) {
        New-Item -Path $backupPath -ItemType Directory -Force | Out-Null
    }

    # ログファイルのコピー
    $files = Get-ChildItem -Path $sourcePath -File -ErrorAction SilentlyContinue
    if ($files) {
        $files | Copy-Item -Destination $backupPath -Force
        $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        Add-Content -Path $logFile -Value "[$timestamp] 完了: $($files.Count) ファイルをバックアップしました"
    } else {
        $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        Add-Content -Path $logFile -Value "[$timestamp] 情報: バックアップ対象のファイルがありません"
    }

    # 30日以上前のバックアップを削除
    $threshold = (Get-Date).AddDays(-30)
    Get-ChildItem -Path $backupRoot -Directory |
        Where-Object { $_.Name -match "^\d{8}$" -and $_.CreationTime -lt $threshold } |
        ForEach-Object {
            Remove-Item -Path $_.FullName -Recurse -Force
            $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
            Add-Content -Path $logFile -Value "[$timestamp] 削除: 古いバックアップ $($_.Name) を削除しました"
        }
} catch {
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    Add-Content -Path $logFile -Value "[$timestamp] エラー: $($_.Exception.Message)"
}

タスクの登録

[実行環境: PowerShell 7.4 (管理者)]

# トリガー: 毎日午前2時
$trigger = New-ScheduledTaskTrigger -Daily -At "02:00"

# アクション: PowerShell 7.4 でスクリプトを実行
$action = New-ScheduledTaskAction `
    -Execute "C:\Program Files\PowerShell\7\pwsh.exe" `
    -Argument '-NoProfile -NonInteractive -ExecutionPolicy Bypass -File "C:\Scripts\Backup-Logs.ps1"'

# プリンシパル: SYSTEM アカウントで実行
$principal = New-ScheduledTaskPrincipal `
    -UserID "NT AUTHORITY\SYSTEM" `
    -LogonType ServiceAccount `
    -RunLevel Highest

# タスクの登録
Register-ScheduledTask `
    -TaskName "DailyLogBackup" `
    -Trigger $trigger `
    -Action $action `
    -Principal $principal `
    -Description "毎日午前2時にログファイルをバックアップし、30日以上前のバックアップを削除"

動作確認

[実行環境: PowerShell 7.4 (管理者)]

# テスト用のログファイルを作成
"テストログ $(Get-Date)" | Out-File -FilePath "C:\Logs\test.log"

# タスクを手動で即時実行
Start-ScheduledTask -TaskName "DailyLogBackup"

# 少し待ってから結果を確認
Start-Sleep -Seconds 5
Get-ScheduledTask -TaskName "DailyLogBackup" | Get-ScheduledTaskInfo

# バックアップされたファイルを確認
Get-ChildItem -Path "C:\Backup\Logs" -Recurse

10.12.2 サーバー起動時にサービス状態を確認するタスク

サーバーの起動時に、重要なサービスが正常に動作しているかを確認し、結果をログファイルに記録するタスクを作成します。

スクリプトの作成

[ファイル: C:\Scripts\Check-ServiceStatus.ps1]

# ========================================
# サービス状態確認スクリプト
# 実行環境: PowerShell 7.4
# 用途: サーバー起動時に重要サービスの状態を確認し、ログに記録
# ========================================

# 確認対象のサービス一覧
$targetServices = @(
    @{ Name = "W32Time";   DisplayName = "Windows Time" },
    @{ Name = "WinRM";     DisplayName = "Windows Remote Management" },
    @{ Name = "sshd";      DisplayName = "OpenSSH SSH Server" },
    @{ Name = "W3SVC";     DisplayName = "World Wide Web Publishing Service (IIS)" },
    @{ Name = "EventLog";  DisplayName = "Windows Event Log" }
)

# ログファイルの設定
$logFile = "C:\Logs\service-check.log"
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

# ヘッダー出力
Add-Content -Path $logFile -Value ""
Add-Content -Path $logFile -Value "=========================================="
Add-Content -Path $logFile -Value "[$timestamp] サーバー起動後のサービス状態確認"
Add-Content -Path $logFile -Value "=========================================="

# 各サービスの状態を確認
foreach ($svc in $targetServices) {
    $service = Get-Service -Name $svc.Name -ErrorAction SilentlyContinue

    if ($null -eq $service) {
        $status = "未インストール"
        $icon = "[SKIP]"
    } elseif ($service.Status -eq "Running") {
        $status = "実行中"
        $icon = "[ OK ]"
    } else {
        $status = $service.Status.ToString()
        $icon = "[WARN]"
    }

    $message = "$icon $($svc.DisplayName) ($($svc.Name)): $status"
    Add-Content -Path $logFile -Value $message
}

$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Add-Content -Path $logFile -Value "[$timestamp] チェック完了"

タスクの登録

[実行環境: PowerShell 7.4 (管理者)]

# トリガー: サーバー起動時(60秒遅延)
$trigger = New-ScheduledTaskTrigger -AtStartup
$trigger.Delay = "PT60S"  # 起動後60秒待ってから実行(サービスの起動完了を待つ)

# アクション
$action = New-ScheduledTaskAction `
    -Execute "C:\Program Files\PowerShell\7\pwsh.exe" `
    -Argument '-NoProfile -NonInteractive -ExecutionPolicy Bypass -File "C:\Scripts\Check-ServiceStatus.ps1"'

# プリンシパル
$principal = New-ScheduledTaskPrincipal `
    -UserID "NT AUTHORITY\SYSTEM" `
    -LogonType ServiceAccount `
    -RunLevel Highest

# タスクの登録
Register-ScheduledTask `
    -TaskName "StartupServiceCheck" `
    -Trigger $trigger `
    -Action $action `
    -Principal $principal `
    -Description "サーバー起動時にサービスの状態を確認してログに記録"

ポイント: トリガーの遅延設定
$trigger.Delay = "PT60S" は、トリガー条件(この場合はサーバー起動)が発生してから60秒後にタスクを実行する設定です。サーバー起動直後はサービスがまだ開始途中の場合があるため、少し待ってから確認するようにしています。PT60S はISO 8601形式の期間表記で、「Period of Time: 60 Seconds」を意味します。

動作確認

[実行環境: PowerShell 7.4 (管理者)]

# タスクを手動で即時実行
Start-ScheduledTask -TaskName "StartupServiceCheck"

# 少し待ってからログを確認
Start-Sleep -Seconds 5
Get-Content -Path "C:\Logs\service-check.log" -Tail 15

出力例:

==========================================
[2025-01-20 10:30:15] サーバー起動後のサービス状態確認
==========================================
[ OK ] Windows Time (W32Time): 実行中
[ OK ] Windows Remote Management (WinRM): 実行中
[ OK ] OpenSSH SSH Server (sshd): 実行中
[ OK ] World Wide Web Publishing Service (IIS) (W3SVC): 実行中
[ OK ] Windows Event Log (EventLog): 実行中
[2025-01-20 10:30:15] チェック完了

10.12.3 週次でディスク容量をレポートするタスク

ディスクの空き容量を毎週チェックし、レポートファイルを生成するタスクを作成します。空き容量が少ない場合は警告を出力します。

スクリプトの作成

[ファイル: C:\Scripts\Report-DiskSpace.ps1]

# ========================================
# ディスク容量レポートスクリプト
# 実行環境: PowerShell 7.4
# 用途: ディスク容量を確認し、レポートを生成。空き容量が少ない場合は警告
# ========================================

# 設定
$reportPath = "C:\Logs\disk-report.log"
$warningThresholdPercent = 20  # 空き容量がこの割合を下回ったら警告

$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

# ヘッダー出力
Add-Content -Path $reportPath -Value ""
Add-Content -Path $reportPath -Value "=========================================="
Add-Content -Path $reportPath -Value "[$timestamp] 週次ディスク容量レポート"
Add-Content -Path $reportPath -Value "=========================================="

# ボリューム情報の取得
$volumes = Get-Volume | Where-Object {
    $_.DriveLetter -and $_.DriveType -eq "Fixed"
}

foreach ($vol in $volumes) {
    $totalGB = [math]::Round($vol.Size / 1GB, 2)
    $freeGB = [math]::Round($vol.SizeRemaining / 1GB, 2)
    $usedGB = [math]::Round(($vol.Size - $vol.SizeRemaining) / 1GB, 2)
    $freePercent = if ($vol.Size -gt 0) {
        [math]::Round(($vol.SizeRemaining / $vol.Size) * 100, 1)
    } else { 0 }

    # 警告判定
    if ($freePercent -lt $warningThresholdPercent) {
        $status = "[WARNING]"
    } else {
        $status = "[  OK   ]"
    }

    $line = "$status ドライブ $($vol.DriveLetter): " +
            "合計 ${totalGB}GB / 使用済 ${usedGB}GB / " +
            "空き ${freeGB}GB (${freePercent}%)"
    Add-Content -Path $reportPath -Value $line
}

$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
Add-Content -Path $reportPath -Value "[$timestamp] レポート完了"

タスクの登録

[実行環境: PowerShell 7.4 (管理者)]

# トリガー: 毎週月曜日の午前6時
$trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Monday -At "06:00"

# アクション
$action = New-ScheduledTaskAction `
    -Execute "C:\Program Files\PowerShell\7\pwsh.exe" `
    -Argument '-NoProfile -NonInteractive -ExecutionPolicy Bypass -File "C:\Scripts\Report-DiskSpace.ps1"'

# プリンシパル
$principal = New-ScheduledTaskPrincipal `
    -UserID "NT AUTHORITY\SYSTEM" `
    -LogonType ServiceAccount `
    -RunLevel Highest

# タスクの登録
Register-ScheduledTask `
    -TaskName "WeeklyDiskReport" `
    -Trigger $trigger `
    -Action $action `
    -Principal $principal `
    -Description "毎週月曜日の午前6時にディスク容量レポートを生成"

動作確認

[実行環境: PowerShell 7.4 (管理者)]

# タスクを手動で即時実行
Start-ScheduledTask -TaskName "WeeklyDiskReport"

# 少し待ってからレポートを確認
Start-Sleep -Seconds 5
Get-Content -Path "C:\Logs\disk-report.log" -Tail 10

出力例:

==========================================
[2025-01-20 10:45:30] 週次ディスク容量レポート
==========================================
[  OK   ] ドライブ C: 合計 99.41GB / 使用済 25.73GB / 空き 73.68GB (74.1%)
[2025-01-20 10:45:30] レポート完了

10.13 よくあるエラーと対処法

エラー・症状 原因 対処法
Get-WindowsFeature の一部列が空欄 PowerShell 7.4での表示フォーマットの制限 Select-Object でプロパティを明示指定する
Install-WindowsFeature でエラー 管理者権限で実行していない PowerShell 7.4を「管理者として実行」で起動する
機能インストール後に動作しない 再起動が保留されている Restart Needed 列を確認し、必要なら再起動する
Install-Module PSWindowsUpdate が失敗 NuGetプロバイダーが未インストール Install-PackageProvider -Name NuGet -Force を先に実行
タスクが実行されない(LastTaskResult0x1 スクリプトパスの誤り、または実行ポリシーの制限 スクリプトのパスを確認。-ExecutionPolicy Bypass を指定しているか確認
タスクの LastTaskResult0x41301 タスクがまだ実行中 正常な状態。完了するまで待つ
タスクの LastTaskResult0x41303 タスクが一度も実行されていない Start-ScheduledTask で手動実行してテストする
pwsh.exe が見つからない PowerShell 7.4のインストールパスが異なる Get-Command pwsh でフルパスを確認する

10.14 まとめ

今回は、Windows Serverの運用に必要な3つの重要なスキルを学びました。

  • 役割と機能の管理
    • 「役割」はサーバーの主要な用途(Webサーバー、DNSサーバーなど)、「機能」は補完的なコンポーネント(バックアップ、Telnetクライアントなど)
    • Get-WindowsFeature で一覧確認、Install-WindowsFeature で追加、Uninstall-WindowsFeature で削除
    • -IncludeManagementTools を付けないと管理ツールがインストールされない点に注意
  • Windows Updateの管理
    • PSWindowsUpdateモジュールを使って、PowerShellから更新プログラムの確認・インストールが可能
    • 累積更新プログラムの定期的な適用と、計画的な再起動がサーバー運用の基本
  • タスクスケジューラ
    • タスクは「トリガー」「操作」「プリンシパル」「設定」の4要素で構成
    • PowerShell 7.4のスクリプトを実行する場合は、C:\Program Files\PowerShell\7\pwsh.exe のフルパスで指定
    • 実践例として、ログバックアップ、サービス監視、ディスク容量レポートの3つのタスクを作成

これらのスキルは、日々のサーバー運用を効率化・自動化するための基盤となります。特にタスクスケジューラとPowerShellスクリプトの組み合わせは、定型業務の自動化に非常に強力なツールです。

10.15 次回予告

第11回では「セキュリティ設定の基礎 ― ローカルセキュリティポリシー」と題して、セキュリティポリシーの概念、パスワードポリシーの設定方法、監査ポリシーの基本、そしてセキュリティイベントログの分析方法を学びます。サーバーを安全に運用するためのセキュリティ基盤を構築していきましょう。

10.16 参考リンク

Windows Server