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
InstallState が Available であれば、まだインストールされていない状態です。
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 Needed が Yes と表示された場合は、再起動を行う必要があります。
再起動が必要かどうかを事前に確認する
-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であれば正常終了です。267011(0x00041303)は「タスクはまだ実行されていない」を意味し、267009(0x00041301)は「タスクは現在実行中」を意味します。
10.10 タスクの作成
タスクの作成は、以下のステップで行います。
- トリガーの作成(
New-ScheduledTaskTrigger) - 操作(アクション)の作成(
New-ScheduledTaskAction) - プリンシパル(実行ユーザー)の作成(
New-ScheduledTaskPrincipal) - タスクの登録(
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
State が Ready であれば、タスクは正常に登録され、次回のトリガー時刻に実行されます。
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 を先に実行 |
タスクが実行されない(LastTaskResult が 0x1) |
スクリプトパスの誤り、または実行ポリシーの制限 | スクリプトのパスを確認。-ExecutionPolicy Bypass を指定しているか確認 |
タスクの LastTaskResult が 0x41301 |
タスクがまだ実行中 | 正常な状態。完了するまで待つ |
タスクの LastTaskResult が 0x41303 |
タスクが一度も実行されていない | 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 参考リンク
- Get-WindowsFeature – Microsoft Learn
- Install-WindowsFeature – Microsoft Learn
- Uninstall-WindowsFeature – Microsoft Learn
- Register-ScheduledTask – Microsoft Learn
- New-ScheduledTaskTrigger – Microsoft Learn
- New-ScheduledTaskAction – Microsoft Learn
- New-ScheduledTaskPrincipal – Microsoft Learn
- PowerShell 7 module compatibility in Windows Server 2025 – Microsoft Learn
- PSWindowsUpdate – PowerShell Gallery
