検索
連載

Windows Admin Centerから拝借する「再起動スケジューリング」のマル秘テク山市良のうぃんどうず日記(214)

少し前に別の連載記事で、Windows Admin Centerのバグを指摘しつつ、そのバグのある機能を期待通りに動くようにした、再利用可能なPowerShellスクリプトを提案しました。今回はバグではありませんが、Windows Admin Centerの「更新プログラム」ツールにある再起動のスケジューリング機能を拝借します。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「山市良のうぃんどうず日記」のインデックス

山市良のうぃんどうず日記

Windows Admin Centerで使われている“目からうろこ”の再起動テク

 以下の連載記事では、「Windows Admin Center」の「Get-NumberOfLoggedOnUsers」ファンクションが、ある条件下で正しい結果を返さないというバグを指摘し、それを修正して、期待通りに動作する「Get-NumberOfLoggedOnUsers」ファンクションを作りました(注:Windows Admin Centerのバグを修正するものではありません)。日常的な自動化された運用管理タスクの中で、WindowsやWindows Serverにログオン中のユーザーがいないかどうかを確認するのに活用できると思ったからです。

 今回は、Windows Admin Centerの「更新プログラム」ツールが備える、更新プログラムのインストール後の「再起動スケジューリング」を取り上げます。この機能にバグがあるわけではありません。どのように実装されているのか興味があったからです。

 「更新プログラム」ツールの特徴は、個々の更新プログラムのインストールの要否を選択できること、そして再起動を要求する更新プログラムをインストールする際、再起動の開始日時をスケジューリングできることです(画面1)。

画面1
画面1 Windows Admin Centerの「更新プログラム」ツールを利用すると、更新プログラムのダウンロードとインストールをすぐに開始しながら、再起動の開始日時を先延ばし(スケジューリング)できる

 更新プログラムの確認とダウンロード、インストールには「Windows Update Agent(WUA)API」を利用します。MicrosoftはWSH(Windows Script Host)で動く、WUA API対応の便利なサンプルスクリプト「WUA_SearchDownloadInstall.vbs /Automate」を公開しているので、Windows Admin Centerのこの部分と同様のことをスクリプトで自動実行するのは比較的簡単です。

 では、再起動のスケジューリングはどのように実現されているのでしょうか。再起動をスケジューリングした後に、対象サーバの「タスクスケジューラ」を確認してみましたが、タスクとしてはスケジューリングされていませんでした。

 しかし、スケジューリングした日時の10分前に、ログオン中のユーザーのデスクトップに突然表示された「サインアウトしようとしています。Windowsを10分後にシャットダウンします。」のメッセージダイアログボックスを見て、これが「shutdown.exe」コマンドでスケジューリングされたものであると気が付きました。

 Windows Admin Centerには、各ツールの個々の機能を実装しているPowerShellスクリプトを表示する機能があります。「更新プログラム」ツールの更新プログラムのインストール開始や再起動のスケジューリングは、「Install-WindowsUpdates」ファンクションに実装されていました。

 その実装方法は至ってシンプルでした。現在の日時から再起動をスケジューリングした日時までの秒数を計算し、再起動が必要な更新プログラムのインストール後に「shutdown.exe -r -t <秒数>」を実行しているのです(画面2)。

画面2
画面2 現在の日時から指定した日時までの秒数を計算し、shutdown.exeコマンドの「-t」オプションに指定していた

 このアイデアは思い付きませんでした。タスクへの登録ではないので、スケジューリングされた日時より前に再起動してしまっても、タスクが残るようなことはありません。スクリプトによる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"
▲直近の「午前2時(2:00)」に再起動を開始するコード
画面3
画面3 次の「17時30分(17:30)」に再起動を開始するようにスケジューリングする例

 次の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"
▲直近の「土曜日午前2時」に再起動を開始するコード

 以前、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.

ページトップに戻る