概要
本記事では、Windows タスクスケジューラを用した高度な自動運用手法を解説します。
条件付きトリガー、イベントログ連動実行、PowerShellによるタスク登録・制御、そしてセキュリティを考慮した運用方法を包括的に紹介します。
変数表記について
| 変数名 | 設定例 | 備考 |
|---|---|---|
<<TASK_NAME>> |
Daily-Backup |
タスク名 |
<<SCRIPT_PATH>> |
C:\Scripts\backup.ps1 |
実行するスクリプトのパス |
<<EVENT_ID>> |
4625 |
トリガー対象のイベントID |
<<USERNAME>> |
Administrator |
タスク実行ユーザー |
<<TASK_PATH>> |
\MyCompany\Maintenance |
タスク登録フォルダパス(任意) |
Step 1: タスクの登録と基本設定
PowerShellでタスクを登録する際は、主に以下3つのコマンドレットを組み合わせます。
| コマンドレット | 主な役割 |
|---|---|
New-ScheduledTaskAction |
実行するプログラム・スクリプトの定義 |
New-ScheduledTaskTrigger |
実行タイミング(時間・イベントなど)の定義 |
Register-ScheduledTask |
タスク全体の登録(Action + Trigger + 設定) |
① New-ScheduledTaskAction の主なオプション
| オプション | 説明 | 例 |
|---|---|---|
-Execute |
実行ファイル名 | "powershell.exe" |
-Argument |
コマンドライン引数 | "-NoProfile -NonInteractive -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>" |
-WorkingDirectory |
実行時のカレントディレクトリ | "C:\Scripts" |
-Id |
複数アクションを区別する識別子 | "Action1" |
💡 複数アクションを設定する場合は
New-ScheduledTaskActionを複数生成して配列で渡します。
② New-ScheduledTaskTrigger の主なオプション
| オプション | 説明 | 例 |
|---|---|---|
-Daily |
毎日実行 | -At 3:00AM と併用 |
-Weekly |
毎週実行 | -DaysOfWeek Monday,Wednesday |
-Once |
一度だけ実行 | -At (Get-Date).AddHours(1) |
-AtStartup |
システム起動時に実行 | (引数なし) |
-AtLogOn |
ログオン時に実行 | (引数なし) |
-RepetitionInterval |
繰り返し間隔 | (New-TimeSpan -Minutes 30) |
-RepetitionDuration |
繰り返し継続時間 | (New-TimeSpan -Days 1) |
-RandomDelay |
ランダム遅延 | (New-TimeSpan -Minutes 5) |
-StartBoundary / -EndBoundary |
有効期間の設定 | "2025-01-01T00:00:00" |
⚠️
-RepetitionIntervalと-RepetitionDurationは一部トリガー種別でのみ有効です(例:Daily/Once)。
③ New-ScheduledTaskSettingsSet(任意) の主なオプション
| オプション | 説明 | 例 |
|---|---|---|
-AllowStartIfOnBatteries |
バッテリー使用時に実行を許可するか | $false |
-DontStopIfGoingOnBatteries |
バッテリーに切り替わっても継続するか | $false |
-StartWhenAvailable |
開始可能になった時点で実行する | $true |
-Hidden |
タスクを非表示にする | $true |
-RunOnlyIfNetworkAvailable |
ネットワーク接続が必要な場合に設定 | $true |
-ExecutionTimeLimit |
最大実行時間を設定 | (New-TimeSpan -Hours 2) |
-MultipleInstances |
多重起動ポリシーを設定(IgnoreNew/Parallel/Queue) | "IgnoreNew" |
-RestartCount / -RestartInterval |
再試行回数と間隔を設定 | 3, (New-TimeSpan -Minutes 5) |
💡補足:
New-ScheduledTaskSettingsSetは-Settings引数に渡す設定オブジェクトを生成するコマンドレットです。
電源・再試行・ネットワーク条件などを一元的に管理する場合に活用します。
④ Register-ScheduledTask の主なオプション
| オプション | 説明 | 例 |
|---|---|---|
-TaskName |
登録名 | "Daily-Backup" |
-TaskPath |
タスクフォルダ | "\MyCompany\Maintenance" |
-Action |
定義済みアクションを指定 | $action |
-Trigger |
定義済みトリガーを指定 | $trigger |
-Settings |
追加の設定(省電力条件など) | $settings |
-Description |
管理用説明 | "Daily maintenance backup task" |
-User |
実行ユーザー | "SYSTEM" または "Administrator" |
-RunLevel |
実行権限レベル | Highest |
-Force |
既存タスクを上書き登録 | (引数なし) |
💡補足:
-SettingsはNew-ScheduledTaskSettingsSetコマンドレットで事前に作成した設定オブジェクトを渡します。
したがって、Action・Trigger・Settingsの3点をそれぞれ定義して組み合わせて構成します。
⑤ 設定例
# 実行アクションを定義
$action = New-ScheduledTaskAction -Execute "powershell.exe" `
-Argument "-NoProfile -ExecutionPolicy Bypass -File <<SCRIPT_PATH>>"
# 実行タイミングを定義(毎日午前3時に実行)
$trigger = New-ScheduledTaskTrigger -Daily -At 3:00AM
# タスク登録
Register-ScheduledTask -TaskName "<<TASK_NAME>>" `
-TaskPath "<<TASK_PATH>>\Daily" `
-Action $action -Trigger $trigger `
-User "<<USERNAME>>" -Description "毎日午前3時に実行する定時タスク"
⑥ 注意点まとめ
-ExecutionPolicy Bypassは署名検証のないスクリプト実行を許可するため、内部限定で使用。- 実行ユーザーは SYSTEM またはサービス専用アカウントを推奨。
-RepetitionIntervalの最小値は 1 分、-RepetitionDurationの既定上限は 1 日です。- タスクの再登録時は
-Forceを明示的に付与しないと上書きされません。 -RunLevel Highestは管理者権限が必要な処理のみで使用すること。
Step 2: イベントログトリガーによる自動実行(XMLテンプレート付き)
PowerShell単体では New-ScheduledTaskTrigger にイベントトリガー指定(-OnEvent 等)は未サポートのままです。
そのため、イベントトリガーを利用する場合は XML 定義をインポートします。
登録コマンド:
$xml = @'
<Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Author><<USERNAME>></Author>
<Description>イベントID <<EVENT_ID>> 発生時にスクリプト実行</Description>
</RegistrationInfo>
<Triggers>
<EventTrigger>
<Enabled>true</Enabled>
<Subscription><![CDATA[
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">*[System[(EventID=<<EVENT_ID>>)]]</Select>
</Query>
</QueryList>
]]></Subscription>
</EventTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>SYSTEM</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<ExecutionTimeLimit>PT1H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Command>
<Arguments>-NoProfile -ExecutionPolicy Bypass -File "<<SCRIPT_PATH>>"</Arguments>
</Exec>
</Actions>
</Task>
'@
Register-ScheduledTask -TaskName "<<TASK_NAME>>" -TaskPath "<<TASK_PATH>>\OnEvent" -Xml $xml -User "SYSTEM"
Step 3: 条件付きトリガーと実行条件の組み合わせ
タスクの「条件」設定(電源状態、ネットワーク接続、アイドル状態など)を New-ScheduledTaskSettingsSet で定義します。
$settings = New-ScheduledTaskSettingsSet `
-AllowStartIfOnBatteries:$false `
-DontStopIfGoingOnBatteries:$false `
-StartWhenAvailable:$true `
-Hidden:$false `
-RunOnlyIfNetworkAvailable:$true `
-ExecutionTimeLimit (New-TimeSpan -Hours 2)
Register-ScheduledTask -TaskName "<<TASK_NAME>>_Cond" `
-TaskPath "<<TASK_PATH>>\Conditional" `
-Action $action -Trigger $trigger -Settings $settings `
-User "<<USERNAME>>" -Description "条件付き実行タスク(ネットワーク接続/AC電源)"
主な条件設定例
| 条件 | 設定項目 | 説明 |
|---|---|---|
| AC電源時のみ | -AllowStartIfOnBatteries:$false |
バッテリー駆動時は実行しない |
| ネットワーク接続必須 | -RunOnlyIfNetworkAvailable:$true |
ネットワーク未接続時は実行しない |
| アイドル時のみ実行 | XML もしくは COM 経由 | PowerShell 標準では明示サポート少なめ |
| 最大実行時間設定 | -ExecutionTimeLimit |
長時間実行を防止 |
| 再試行設定 | XML 編集または繰返しTrigger設定 | PowerShell単体では一部制限あり |
Step 4: 既存タスクの制御
運用中のタスクを PowerShell から管理・監視できます。
# タスク一覧確認
Get-ScheduledTask | Where-Object TaskPath -like "<<TASK_PATH>>*"
# 有効化/無効化
Enable-ScheduledTask -TaskName "<<TASK_NAME>>"
Disable-ScheduledTask -TaskName "<<TASK_NAME>>"
# 実行状態確認
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>" |
Select-Object TaskName, NextRunTime, LastRunTime, LastTaskResult
運用ログ(Operational Log)の有効化
タスクスケジューラの「Operational」ログは既定で無効の場合があります。
トラブルシューティングや詳細な履歴確認のため、必要に応じて有効化してください。
有効化する場合:
wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true
Step 5: トラブルシューティングとログ確認
タスクが期待どおり動作しない場合の確認手順です。
# タスクの最新実行結果を取得
Get-ScheduledTaskInfo -TaskName "<<TASK_NAME>>"
# タスクスケジューラ運用ログ取得
Get-WinEvent -LogName "Microsoft-Windows-TaskScheduler/Operational" -MaxEvents 50 |
Where-Object { $_.Message -match "<<TASK_NAME>>" } |
Select-Object TimeCreated, Id, Message | Format-Table -AutoSize
よくある失敗要因と対応
| 原因 | 対策 |
|---|---|
| 権限不足 | 実行ユーザー権限の見直し/サービスアカウント利用 |
| スクリプト実行ポリシー制限 | -ExecutionPolicy Bypass または署名付きスクリプト使用検討 |
| タスクパス・説明未設定 | -TaskPath/-Descriptionを設定して管理を明確に |
| イベントトリガー未動作 | XML定義を再確認、イベントログフィルターを検証 |
| トリガー・条件の矛盾 | 複数トリガー・設定を精査し、意図どおり実行されるか確認 |
Step 6: 推奨設定
- 実行ユーザーは「SYSTEM」または専用サービスアカウントとし、最小権限を遵守する。
- スクリプトにはログ出力や例外処理を実装し、実行可否を記録する。
- タスク定義をテンプレート化(XML形式)し、GitHubなどでバージョン管理する。
- 実行履歴を定期監視(
Get-ScheduledTaskInfo使用)し、異常時はアラートを出す。 - 不要になったタスクは
Unregister-ScheduledTaskで削除し、ライブラリを整理する。
まとめ
Windows タスクスケジューラは、定時実行だけでなく、イベント駆動・条件制御・PowerShell統合により、柔軟かつ強力な自動化基盤となります。
コードによる登録・管理・監視体制を構築することで、再現性・管理性・セキュリティを備えた運用を実現できます。
