
かつて山市良と呼ばれたおじさんのブログ
セイテクエンジニアのブログ かつて山市良と呼ばれたおじさんのブログ vol.129 毎月第2火曜日(パッチチューズデイ)の週末に更新タスクを開始したい|どうする!?残る閉域網の更新管理(4)
2025年08月18日配信
2025年08月18日更新
執筆者:山内 和朗
Windows Updateは毎月米国時間の第2火曜日にリリースされます。日本では、翌水曜日の早朝(3時頃)にあたります。タスクスケジューラのトリガーで、毎月第2火曜日にタスクを実行させる簡単に実現できます。しかし、米国時間の第2火曜日を起点として、日本時間でその翌日または数日後にタスクを実行させるのは、タスクスケジューラの機能だけでは困難です。
前回(vol.128)は、更新プログラムのインストールから再起動までを行うPowerShellスクリプトを1回限りのタスクでスケジュールすることを想定しました。この方法だと、毎月タスクのトリガーを変更してあげる必要があります。システム時間を米国のタイムゾーンで運用しているのであば、リリース日の特定の日時にスケジュールすることは簡単です。しかし、日本時間における翌水曜日、あるは数日後の日時にスケジュールすることは、タスクスケジューラのUIを見る限り、できそうにありません(画面1)。「遅延時間を指定する」というオプションで最大1日遅延することは可能ですが、この機能はタスクの開始をランダム化するためのもので、最大で1日遅延されるとはいえ、数分後に実行されないとも限りません。
画面1 日本時間ベースでWindows Updateのリリース日(米国時間で第2火曜日の翌日)にあわせた毎月トリガーを設定することはできない
PowerShellのScheduledTasksモジュールのコマンドレットを利用すれば、米国時間第2火曜日の翌日、あるいは数日後(例えば4日後の土曜日)にタスクを実行するように、1回限りのタスクの開始日時を変更することができます。例えば、1回限りのタスク「demotask」があるとしましょう。PowerShellで次のコマンドラインを実行すると、4日後の3行目のコマンドラインを実行したときの日時に開始時間を変更することができます(画面2、画面3)。
PS C:\> $task = (get-ScheduledTask -TaskName "demotask") PS C:\> $trigger = $task.Triggers[0] PS C:\> $trigger.StartBoundary = (Get-Date).AddDays(4).ToString("s") PS C:\> Set-ScheduledTask -TaskName "demotask" -Trigger $trigger |
上記のコマンドラインは、「ユーザーがログオンしているときにのみ実行する」オプションが有効な場合です。「ユーザーがログオンしているかどうかにかかわらず実行する」オプションを使用する場合は、ユーザー名とパスワード(プレーンテキスト)を渡す必要があります。
PS C:\> Set-ScheduledTask -TaskName "demotask" -Trigger $trigger -User <ユーザー名> -Password <パスワード> |
画面2 PowerShellのScheduledTasksモジュールのコマンドレットを使用して、1回限りトリガーのタスクの開始時間を4日後に変更する
画面3 1回限りトリガーのタスクの開始時間が現在時刻の4日後の同時刻に変更された。「ユーザーがログオンしているかどうかにかかわらず実行する」オプションを使用する場合は、最後のコマンドラインにユーザー名とパスワード(プレーンテキスト)を渡す必要がある
[changetaskschedule.ps1](プレーンテキストで表示)
$mypwd = [System.Net.NetworkCredential]::new("", (Get-Content "<暗号化パスワードファイル保存先パス>\mypwd.sec" | ConvertTo-SecureString)).Password
$task = Get-ScheduledTask -TaskName "<開始日時を変更するタスク名>"
$trigger = $task.Triggers[0]
$trigger.StartBoundary = (Get-Date).AddDays(4).ToString("s")
#Set-ScheduledTask -TaskName "<開始日時を変更するタスク名>" -Trigger $trigger
Set-ScheduledTask -TaskName "<開始日時を変更するタスク名>" -Trigger $trigger -User Administrator -Password $mypwd
画面4 第2火曜日に「changetaskschedule.ps1」を実行して、更新用タスクの1回限りのトリガーの開始日時を毎月自動変更する
なお、このスクリプトは更新用タスクに「ユーザーがログオンしているかどうかにかかわらず実行する」オプションが設定されていることを前提としています。その場合、スケジュールを変更するタスクの実行アカウント(Administratorなど)のパスワードをプレーンテキストで渡す必要がありますが、タスクにプレーンテキストをそのまま書き込むのは適切ではありません。そこで、事前に暗号化したパスワードファイル(この例では「mypwd.sec」)を作成しておき、そのファイルからパスワードを復号して渡すようにしています。パスワードファイルは、次の方法で作成することができます。
PS C:\> $mypwd = Read-Host "Enter Password" -AsSecureString Enter Password: <パスワード> PS C:\> $mypwd | ConvertFrom-SecureString | Set-Content "<暗号化パスワードファイル保存先パス>\mypwd.sec" |
2025年6月および7月は、この方法で第2火曜日の週末の土曜日に更新プログラムのインストールと再起動が行われたことをログで確認しました(画面5)。
画面5 2025年6月および7月は、第2火曜日と同じ週の土曜日に更新プログラムのインストールと再起動が自動実行された
前回までを含むここまでの実装を紙芝居で表現してみました。