Windows Server 2022 with PS 第13章

第13章: タスクスケジューラの活用方法


1. この章で解説する主要な技術・概念(箇条書き)

  1. Windows Server 2022のタスクスケジューラの基本と内部構造
    • タスク、トリガー、アクション、条件、設定の概要
  2. PowerShellを用いたタスクの作成・管理・削除
    • New-ScheduledTaskAction, New-ScheduledTaskTrigger, Register-ScheduledTask, Set-ScheduledTask, Unregister-ScheduledTask など
  3. タスクのトリガーとアクションの種類
    • 時刻・日付ベース、ログオン時、イベント発生時など
    • スクリプト実行やプログラム起動、メール送信(非推奨)など
  4. タスクの実行アカウントとセキュリティ
    • SYSTEMアカウント vs. ドメインユーザーアカウント、パスワードの保存
    • UACとの関係、Run with highest privileges の扱い
  5. 定期的なバックアップやスクリプト実行の自動化
    • 第8章・第12章で学んだバックアップ/アプリケーション管理の定期タスク化
    • Powershellスクリプトへの引数渡し、ログ出力設計
  6. タスクのモニタリングと履歴確認、トラブルシューティング
    • タスク履歴タブ、Operationalイベントログの活用
    • 実行結果のステータスコード、終了コードの確認方法

2. Windows Server 2022のタスクスケジューラの基本と内部構造

2-1. タスクスケジューラとは

  • タスクスケジューラはWindowsが標準搭載する自動実行機能。
  • 登録された各「タスク」が、設定された「トリガー」(日時やイベント)で「アクション」(スクリプト/プログラムの実行など)を実行し、条件(AC電源時のみ等)や設定(タスク再実行ポリシーなど)を加味しながら動作する。
  • サーバー管理者はGUIの「タスク スケジューラ(taskschd.msc)」か、PowerShell/コマンドラインで管理することが多い。

2-2. タスクスケジューラのプロパティ概観

  1. General: タスク名、説明、実行ユーザー、最高権限で実行するかなど
  2. Triggers: 実行のきっかけ(Schedule, Event, Logon, Idleなど)を複数設定可能
  3. Actions: 実行内容(プログラム/スクリプト名、引数、作業ディレクトリ)
  4. Conditions: AC電源のみ、ネットワーク接続時のみ、アイドル状態時のみなど
  5. Settings: 実行に失敗した際の再試行間隔・回数、タスクの停止条件、強制終了タイムアウトなど

3. PowerShellを用いたタスクの作成・管理・削除

3-1. 新規タスク作成手順例

# 1. アクション定義 (PowerShellスクリプトの実行)
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\Backup-Script.ps1"

# 2. トリガー定義 (毎日深夜1時実行)
$trigger = New-ScheduledTaskTrigger -Daily -At 01:00

# 3. タスク本体の組み立て
$task = New-ScheduledTask -Action $action -Trigger $trigger -Description "Daily Backup Task"

# 4. タスクの登録 (SYSTEMアカウントで実行する例)
Register-ScheduledTask -TaskName "DailyBackup" -InputObject $task -User "NT AUTHORITY\SYSTEM"
  • -User "NT AUTHORITY\SYSTEM" はローカルシステムアカウントでの実行例。
  • 別のドメインアカウントで実行したい場合は -User "EXAMPLE\BackupRunner" とし、資格情報入力が求められる。

3-2. タスクの変更・削除

# トリガーを変更 (毎週日曜日2時)
$weeklyTrigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At 02:00
Set-ScheduledTask -TaskName "DailyBackup" -Trigger $weeklyTrigger

# タスクの削除
Unregister-ScheduledTask -TaskName "DailyBackup" -Confirm:$false
  • Set-ScheduledTask は既存タスクのプロパティを上書きする。
  • Get-ScheduledTask, Get-ScheduledTaskInfo で登録済みのタスクや実行状況を確認可能。

4. タスクのトリガーとアクションの種類

4-1. 主なトリガー

  1. Schedule-based: 日次/週次/月次、一定間隔、特定時刻
  2. Logon: 指定ユーザーのログオン時
  3. Event: 特定のEvent IDやイベントソースが発生したとき
  4. Idle: システムが一定時間アイドル状態になったら
  5. Workstation Lock/Unlock: ユーザーがコンピュータをロック/ロック解除した時
# イベントトリガー例: SystemログのEventID 1074 (システムシャットダウンイベント)
$eventTrigger = New-ScheduledTaskTrigger -AtLogOn -User "Administrator"
# ※ EventID指定の高度なトリガーはSCHTASKS /CREATE の方が柔軟な場合あり
  • GUIのタスクスケジューラからイベントトリガーをセットできる場合もあるが、PowerShellネイティブcmdletでの指定は一部制限があるので、SCHTASKS /CREATEコマンドを併用するケースが多い。

4-2. アクションの種類

  • Start a program: EXEやPowerShellスクリプトを指定。引数や作業フォルダ設定可能
  • Send an email / Display a message: GUIのタスクスケジューラ(Windows Server 2012 R2以前)で存在したが、Windows Server 2019/2022では非推奨になっている
  • PowerShellスクリプト: -Execute "PowerShell.exe" + -Argument "-File <Script>"形式で登録

5. タスクの実行アカウントとセキュリティ

5-1. SYSTEMアカウント vs. ユーザーアカウント

  • SYSTEM アカウント:
    • 最上位権限を持ち、パスワード管理不要
    • ネットワークアクセス時にマシンアカウント権限となるため、他サーバーとの連携に制限があることも
  • ドメインユーザーアカウント:
    • ネットワークリソースへのアクセス制御が可能
    • タスク登録時にパスワードを保存するため、定期変更権限最小化などセキュリティ対策が必要
  • 最高特権(Run with highest privileges):
    • UACにより昇格が必要な操作をする場合に有効
    • 誤用するとリスクが高いため、最低限の必要性がある場合のみ設定推奨

5-2. パスワードの保存と管理

  • タスクはCredentialを暗号化してローカルに保存するが、管理者が同サーバーにフルアクセスできれば抽出・復号リスクもゼロではない。
  • 高セキュリティ環境ではグループマネージドサービスアカウント(gMSA) の利用も検討する。
  • パスワード有効期限ポリシーを考慮し、変更後はRegister-ScheduledTaskを再実行してタスクの資格情報を更新する必要がある。

6. 定期的なバックアップやスクリプト実行の自動化

6-1. バックアップスクリプトとの組み合わせ

  • 第8章で作成したBackup-Script.ps1を、タスクスケジューラで深夜帯に1日1回実行すれば、無人バックアップが可能。
  • ログ出力とエラーコードを確認し、失敗時に通知メールを送る仕組みを加えると安定運用に近づく。
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Backup\Backup-Script.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At 02:00
Register-ScheduledTask -TaskName "DailyBackup" -Action $action -Trigger $trigger -User "NT AUTHORITY\SYSTEM"

6-2. サードパーティーアプリ管理の定期実行

  • 第12章で触れたアプリ更新ライセンス期限チェックなどもタスクスケジューラに登録して定期的に実行。
  • Chocolateyの場合、choco upgrade all -y を週末早朝に行うなどして、インストール済みパッケージを最新化するシナリオが考えられる。
  • 大規模本番環境では、テスト環境→本番環境へ段階的にパッチ適用するロールアウト戦略が必要。

7. タスクのモニタリングと履歴確認、トラブルシューティング

7-1. タスク履歴タブの見方

  • GUIのタスクスケジューラ「ライブラリ」から該当タスクを選択し「履歴」タブを見ると、タスク開始時間、アクションの実行結果、イベントID 100~200番台などが並び、成功/失敗が分かる。
  • Server CoreではGUIで履歴を見れないため、イベントビューアまたはGet-WinEvent -ProviderName "Microsoft-Windows-TaskScheduler" で代用。

7-2. 実行結果のステータスコード($LASTEXITCODE)

  • スクリプトがPowerShell.exeで動く場合、終了コードは**$LASTEXITCODE** に反映される。0が成功、1以上が失敗等。
  • タスクスケジューラはコマンドの終了コードをタスク履歴に記録するため、スクリプトの末尾exit 0exit 1を明示するとトラブルシュートが容易。

7-3. 典型的なトラブル例と対処

  1. 「0x1 (Incorrect function)」
    • スクリプトパスや引数指定に誤り、またはカレントディレクトリが異なる
    • 絶対パスを正確に指定し、ログ出力で詳細を確認
  2. 「アクセス拒否」
    • 実行アカウントが管理者権限を持っていないか、ファイル/フォルダに対するACLが不足
    • Run with highest privilegesが必要なケースか検討
  3. 「スクリプトが実行されずに終了」
    • ExecutionPolicyがRestricted/RemoteSignedなどでブロックされている
    • -ExecutionPolicy Bypass を引数に付与するか、実行ポリシーを変更

8. 章末まとめと次章へのつながり

8-1. 学習のまとめ

  • タスクスケジューラは、Windows Server上のバッチ処理やスクリプト自動化を実現する中核機能であり、トリガー(スケジュール/イベント/ログオン/アイドル)に応じてアクション(スクリプトやプログラム)を実行する仕組みを理解しました。
  • PowerShellを用いれば、New-ScheduledTaskAction, New-ScheduledTaskTrigger, Register-ScheduledTask などでGUIに頼らず、定義から登録までを一括管理できるメリットがある。
  • 実行アカウントとセキュリティ(SYSTEMか特定ユーザーか)を適切に選び、UACやパスワード管理、権限最小化に注意しなければならない。
  • バックアップやサードパーティーアプリ管理(アップデートチェックなど)をタスクスケジューラに登録することで、日々の運用負荷を軽減し、人為的ミスを減らす効果が大きい。
  • タスクの履歴イベントログで成功/失敗の情報をモニタリングし、失敗時はアラートメールや再試行設定を組み込むなど、安定稼働をさらに高める方法を学習した。

8-2. 次章へのつながり

  • 次章(第14章)では、仮想化とHyper-Vの管理に焦点を当てます。
  • タスクスケジューラを使ってHyper-Vのスナップショット取得夜間メンテナンスの自動化シナリオも多く、これまで学んだPowerShell + タスクスケジューラの技術をさらに応用できます。
  • WindowsコンテナやHyper-Vの仮想マシン管理を組み合わせ、大規模かつ柔軟な仮想化インフラを自動化する方法を次章で深める予定です。