Windows Admin Centerから拝借する「再起動スケジューリング」のマル秘テク:山市良のうぃんどうず日記(214)
少し前に別の連載記事で、Windows Admin Centerのバグを指摘しつつ、そのバグのある機能を期待通りに動くようにした、再利用可能なPowerShellスクリプトを提案しました。今回はバグではありませんが、Windows Admin Centerの「更新プログラム」ツールにある再起動のスケジューリング機能を拝借します。
Windows Admin Centerで使われている“目からうろこ”の再起動テク
以下の連載記事では、「Windows Admin Center」の「Get-NumberOfLoggedOnUsers」ファンクションが、ある条件下で正しい結果を返さないというバグを指摘し、それを修正して、期待通りに動作する「Get-NumberOfLoggedOnUsers」ファンクションを作りました(注:Windows Admin Centerのバグを修正するものではありません)。日常的な自動化された運用管理タスクの中で、WindowsやWindows Serverにログオン中のユーザーがいないかどうかを確認するのに活用できると思ったからです。
- 真夏の怪異、ログオン中のユーザーが1人少ない! それは「Shift-JIS」の呪い?(連載:その知識、ホントに正しい? Windowsにまつわる都市伝説 第189回)
今回は、Windows Admin Centerの「更新プログラム」ツールが備える、更新プログラムのインストール後の「再起動スケジューリング」を取り上げます。この機能にバグがあるわけではありません。どのように実装されているのか興味があったからです。
「更新プログラム」ツールの特徴は、個々の更新プログラムのインストールの要否を選択できること、そして再起動を要求する更新プログラムをインストールする際、再起動の開始日時をスケジューリングできることです(画面1)。
画面1 Windows Admin Centerの「更新プログラム」ツールを利用すると、更新プログラムのダウンロードとインストールをすぐに開始しながら、再起動の開始日時を先延ばし(スケジューリング)できる
更新プログラムの確認とダウンロード、インストールには「Windows Update Agent(WUA)API」を利用します。MicrosoftはWSH(Windows Script Host)で動く、WUA API対応の便利なサンプルスクリプト「WUA_SearchDownloadInstall.vbs /Automate」を公開しているので、Windows Admin Centerのこの部分と同様のことをスクリプトで自動実行するのは比較的簡単です。
- 新しくなったWUA_SearchDownloadInstall.vbs(自動化やオフラインスキャンに対応)(筆者の個人ブログ:山市良のえぬなんとかわーるど)
では、再起動のスケジューリングはどのように実現されているのでしょうか。再起動をスケジューリングした後に、対象サーバの「タスクスケジューラ」を確認してみましたが、タスクとしてはスケジューリングされていませんでした。
しかし、スケジューリングした日時の10分前に、ログオン中のユーザーのデスクトップに突然表示された「サインアウトしようとしています。Windowsを10分後にシャットダウンします。」のメッセージダイアログボックスを見て、これが「shutdown.exe」コマンドでスケジューリングされたものであると気が付きました。
Windows Admin Centerには、各ツールの個々の機能を実装しているPowerShellスクリプトを表示する機能があります。「更新プログラム」ツールの更新プログラムのインストール開始や再起動のスケジューリングは、「Install-WindowsUpdates」ファンクションに実装されていました。
その実装方法は至ってシンプルでした。現在の日時から再起動をスケジューリングした日時までの秒数を計算し、再起動が必要な更新プログラムのインストール後に「shutdown.exe -r -t <秒数>」を実行しているのです(画面2)。
このアイデアは思い付きませんでした。タスクへの登録ではないので、スケジューリングされた日時より前に再起動してしまっても、タスクが残るようなことはありません。スクリプトによるWindows Updateの自動化と組み合わせるなど、さまざまな管理操作に応用できそうです。
指定した日時に再起動を開始するPowerShellスクリプト
筆者はプログラマーではないので、コードが冗長的なのはご勘弁いただくとして、2つのPowerShellスクリプトを作成しました。
次のPowerShellスクリプトは、直近の「午前2時(2:00)」に再起動を開始するサンプルコードです。今まさに午前2時の場合は10秒後に再起動を開始し、午前2時を回ったばかりの場合は翌日の午前2時に開始します。開始時刻は「$restartTime」で変更できます(画面3)。
$restartTime = "02:00" $restartDateTime = Get-Date((Get-Date).ToString("yyyy/MM/dd") + " " + $restartTime) if (((Get-Date $restartDateTime) - (Get-Date)) -lt 0) { $restartDateTime = Get-Date(((Get-Date).AddDays(1)).ToString("yyyy/MM/dd") + " " + $restartTime) } $waittime = 10 $waittime = [decimal]::round(((Get-Date $restartDateTime) - (Get-Date)).TotalSeconds) if ($waittime -lt 10) { $waittime = 10 } shutdown -r -t $waittime -c "Start scheduled reboot by script"
次のPowerShellスクリプトは、直近の土曜日午前2時に(曜日は「$dayofweek」の値で変更可能)に再起動を開始するサンプルコードです。今日が土曜日で、今まさに午前2時の場合は10秒後に再起動を開始し、午前2時を回ったばかりの場合は翌週の土曜日午前2時に再起動を開始します。
$restartTime = "02:00" $dayofweek = 6 # 0=Sunday - 6=Saturday if ((Get-Date).DayOfWeek.Value__ -eq $dayofweek) { $restartDateTime = Get-Date((Get-Date).ToString("yyyy/MM/dd") + " " + $restartTime) if (((Get-Date $restartDateTime) - (Get-Date)) -lt 0) { $restartDateTime = Get-Date(((Get-Date).AddDays(7)).ToString("yyyy/MM/dd") + " " + $restartTime) } } else { $restartDateTime = Get-Date(((Get-Date).AddDays($dayofweek - (Get-Date).DayOfWeek.Value__)).ToString("yyyy/MM/dd") + " " + $restartTime) } $waittime = 10 $waittime = [decimal]::round(((Get-Date $restartDateTime) - (Get-Date)).TotalSeconds) if ($waittime -lt 10) { $waittime = 10 } $restartDateTime = Get-Date((Get-Date).ToString("yyyy/MM/dd") + " " + $restartTime) $waittime = 10 $waittime = [decimal]::round(((Get-Date $restartDateTime) - (Get-Date)).TotalSeconds) if ($waittime -lt 10) { $waittime = 10 } shutdown -r -t $waittime -c "Start scheduled reboot by script"
以前、Windows Updateが再起動待ちになったら、アクティブ時間外が来る前にシャットダウン(または再起動)を開始するスクリプトを紹介しました。今回のスクリプトは、すぐにではなく、指定した日時になったら開始するスクリプトになります。
筆者紹介
山市 良(やまいち りょう)
岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(2020-2021)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows版Docker&Windowsコンテナーテクノロジ入門』(日経BP社)、『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- Windows 10 バージョン1909以降の機能更新プログラム、これに注意しないと「ハマる」
ここ数カ月、Windows 10の機能更新プログラムおよびISOメディアを使用したバージョンアップグレードに関して、特定の条件下で発生する既知の問題が明らかになっています。企業のクライアントPCのバージョンアップグレードを今計画している場合は、影響を受けないように注意してください。 - 2021年にサポートが終了するMicrosoft製品まとめ
前回(第90回)は、Windows 10とMicrosoft Office製品について、2021年以降のサポートライフサイクルを再確認しました。今回は視点を変えて、2021年内にサポートが終了するMicrosoftの製品/技術についてまとめます。 - 【速報】Windows 10 October 2020 Update(バージョン20H2)が正式リリースに
Windows 10の最新バージョン「Windows 10 October 2020 Update(バージョン20H2)」が正式にリリースされました。Windows Updateを通じて段階的にロールアウトされるため、全てのPCで利用可能になっているわけではありません。案内が来るのを気長にお待ちください。 - Windows 10におけるレガシーSMBプロトコルに関する重要な変更とSMB v3新機能まとめ
Windows 10およびWindows Server 2016以降、レガシーなSMB(SMB v1やSMB v2)の扱いについて、既定の動作に幾つか重要な変更が行われています。Windows 10やWindows Server 2016以降への移行時、または機能更新プログラムによる新バージョンへのアップグレードのタイミングで、以前のWindowsネットワークになかった挙動に遭遇した場合は、変更点を確認してみてください。