Windowsサーバの管理者はセキュリティ向上のため、毎月WindowsUpdateを行わなければいけません。
通常はメンテナンス対象サーバにリモートデスクトップ(RDP)してWindowsUpdateを実行しますが、毎回RDP接続するのが面倒なのでリモートから実行できないかと思い試しました。
この記事では、
- WindowsUpdateの度にリモートデスクトップするのが面倒
- リモートホストからWindowsUpdateを実行したい
こんな方に読んでもらいたいです。
リモートWindowsUpdateのやり方
管理者が操作するコンピュータを接続元ホスト
実際にWindowsUpdateでパッチを適用したいコンピュータを接続先ホストと表現します。
作業時に操作するコンピュータ
実際にWindowsUpdateするコンピュータ
この方法は事前に接続先ホストで設定が必要になります。
まずはやり方を説明するのでイメージと合っているか確認してください。
接続元ホストでコマンドプロンプトを開いてコマンドを実行する
WindowsUpdateを開始するコマンド
schtasks /Run /S 192.168.50.217 /U Admin /P Adminpass /TN sample
コマンドが成功すると下記メッセージが表示される。
成功:スケジュール タスク"sample"の実行が試行されました。
接続先ホストでは、コマンドプロンプトが表示されてWindowsUpdateの処理ログが流れます。
自動でWindowsUpdate処理が開始される
2022/06/14 11:01:08.505 [INFO] Autoexec Disabled. 2022/06/14 11:01:09.474 --- Running Windows Update --- 2022/06/14 11:01:09.490 Searching for updates... 2022/06/14 11:01:10.091 Full Update ~中略~ 2022/06/14 11:03:41.507 =-=-=-=-=- Windows Update finished -=-=-=-=-=
処理状況を確認するコマンド
schtasks /Query /S 192.168.50.217 /U Admin /P Adminpass /V /FO list /TN sample
表示される結果※一部抜粋
状態: 準備完了←準備完了は処理が終わっている 前回の実行時刻:2022/06/14 20:26:34 前回の結果: 0←0は正常終了
リモートでのWindowsUpdateの処理は以上になります。
接続元ホストから1行コマンドを実行するだけで接続先ホストのWindowsUpdateを実行する事ができました。これでリモートデスクトップやWindowsUpdate画面を開く手間を省くことができます。
この方法を試すには接続先ホストでいくつか設定が必要なので次の項目を確認してください。
事前に必要な設定
接続先ホストでは6つの設定が必要になります。
- WindowsUpdateを行うプログラムファイルをダウンロード ←PowerShellに1行コピペ
- プログラムファイルを実行するコマンドを作成 ←コピペでファイルを1つ作る
- コマンドを実行するタスクを作成 ←コマンドプロンプトに1行コピペ
- アカウントの制限を解除 ←ファイル名を指定して実行で画面を開いて2クリック操作
- リモート接続で特権権限を使える設定 ←コマンドプロンプトに1行コピペ
- リモート接続用のFWを解除 ←コマンドプロンプトに1行コピペ
全て1〜2ステップなので簡単にできます。
ここからの設定は全て接続先ホストで行ってください。
WindowsUpdateを行うプログラムファイルをダウンロードを取得
管理者権限でPowerShellを開いて下記コマンドを実行します。
if(-not (Test-Path C:\WindowsUpdate)){ md C:\WindowsUpdate } Invoke-WebRequest https://raw.githubusercontent.com/MuraAtVwnet/WindowsUpdate/master/AutoWindowsUpdate.ps1 -OutFile C:\WindowsUpdate\AutoWindowsUpdate.ps1
https://www.vwnet.jp/Windows/PowerShell/FullAutoWU.htm
上のコマンドを実行したら「C:\WindowsUpdate」を開いて「AutoWindowsUpdate.ps1」がある事を確認します。
インターネットに接続していないと失敗するので、失敗する場合はインターネットに接続できるPCでダウンロードしてから接続先ホストにコピーしてください。
プログラムファイルを実行するコマンドを作成
下記内容をコピペしてメモ帳に貼り付けてください。
rem cls @echo off powershell -NoLogo -NoProfile -ExecutionPolicy RemoteSigned -File "C:\WindowsUpdate\AutoWindowsUpdate.ps1" Full
保存する場所を「C:\WindowsUpdate」ファイル名を「Launch.cmd」にして保存すれば完了です。
この設定は「AutoWindowsUpdate.ps1」を実行する為のコマンドファイルになります。
通常ファイル名の最後が.ps1になっているファイルは実行されないような設定になっていますが、「-ExecutionPolicy RemoteSigned」で一時的に実行可能にする設定にしています。
コマンドを実行するタスクを作成
管理者権限でコマンドプロンプトを開いて下記コマンドを実行してください。
schtasks /Create /TN sample /SC ONCE /SD 1900/01/01 /ST 00:00 /RL highest /TR C:\WindowsUpdate\Launch.cmd
成功すると、
警告: /ST が現時刻よりも早いため、タスクは実行されない可能性があります。 成功: スケジュール タスク "sample" は正しく作成されました。
が表示されます。
また、タスクスケジューラのタスクスケジューラライブラリに「sample」が表示されます。
コマンドファイル「Launch.cmd」はリモートでは操作ができませんが、タスクスケジューラという機能はリモートで操作ができます。
なので「Launch.cmd」をタスクスケジューラに登録して、リモートで「Launch.cmd」の登録されているタスクを実行するような方法をとります。
タスクスケジューラは、日付や時間を指定する事で好きな時間にファイルを実行するWindowsの標準機能です。
今回は実行日を過去の日付に設定する事で勝手に起動はしないようにします。その代わりにコマンドによって強制的に実行します。
アカウントの制限を解除
この設定は接続先ホストでコマンドをテスト実行する場合に必要になります。
[Windowsキー+R]で「ファイル名を指定して実行」画面を開き「UserAccountControlSettings」を入力してOKを押します。
ユーザーアカウント制御の設定画面が開いたら、操作バーを一番したの「通知しない」に移動させてOKを押します。
この設定はコンピュータに変更を加える操作が行われた時の対処を選択します。
デフォルトでは画面を表示して「はい・いいえ」で判断させる状態になっています。
今回はコマンドで実行して判断画面は出したくないので通知しないように設定を変更します。
ここまで設定すれば一度接続先ホスト自身でコマンドを使ってタスクを動かしてみます。
schtasks /Run /TN sample
設定が問題なくできていれば、冒頭に説明した通り新しいコマンドプロンプトの画面が開き、処理のログが表示されます。
ちなみに接続元ホストで実行するコマンドとは少し違うので注意してください。
リモートユーザに特権権限を与える
接続先ホストで管理者権限でコマンドプロンプトを開いて下記コマンドを実行します。
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
成功した場合は、
この操作を正しく終了しました。
が表示されます。
通信に使うWindowsFWを解除
接続先ホストで管理者権限でコマンドプロンプトを開いて下記コマンドを実行します。
netsh advfirewall firewall set rule group="スケジュールされたリモート タスク管理" new enable=yes
成功した場合は、
4 規則を更新しました。 OK
が表示されます。
コマンドプロンプトを管理者権限で起動していないと下記メッセージが表示されます。
要求された操作には、権限の昇格が必要です。管理者として実行してください。
これは接続元ホストでschtasksコマンドを実行した時の通信を受信する為に必要な設定です。
この設定はポート番号135を接続先ホストで許可するものです。
接続元ホストと接続先ホスト間にファイアウォールがある場合はポート135を解放してください。(または、解放の依頼をファイアウォール管理者へ行ってください。)
参考にした情報
接続元ホストで必要な設定は特にありません。
コマンドを実行して接続先ホストのWindowsUpdateが始まるか確認してみてください。
schtasks /Run /S 192.168.50.217 /U Admin /P Adminpass /TN sample
コマンドで色を付けた部分は接続先ホストの情報に書き換えてください。
192.168.50.217は接続先ホストのIPアドレス
Adminは接続先ホストのログインユーザー名
Adminpassは接続先ホストのログインパスワード
処理状況を確認するコマンド
schtasks /Query /S 192.168.50.217 /U Admin /P Adminpass /V /FO list /TN sample
表示される結果※一部抜粋
状態: 準備完了←準備完了は処理が終わっている 前回の実行時刻:2022/06/14 20:26:34 前回の結果: 0←0は正常終了
うまく動かない場合の対処
接続元ホストで「エラー:この要求はサポートされていません。」が表示される
schtasks /Run /S 192.168.50.217 /U Admin /P 1 /TN sample
エラー:この要求はサポートされていません。
接続元ホストで「エラー:アクセスが拒否されました。」が表示される
schtasks /Run /S 192.168.50.217 /U Admin /P 1 /TN sample
エラー:アクセスが拒否されました。
接続元ホストで「エラー:アクセスが拒否されました。」が表示される
schtasks /Run /S 192.168.50.217 /U Admin /P 1 /TN sample
エラー:指定されたファイルが見つかりません。
接続元ホストで「前回の結果:1」が表示される
schtasks /Query /S 192.168.50.217 /U Admin /P Adminpass /V /FO list /TN sample
~前略~
前回の結果:1
~後略~
まとめ
今回はWindowsUpdateをリモートコマンドで実行する方法を紹介しました。
実際に使用するには接続先ホストでいくつか設定が必要なので、業務で使う場合は設定して問題ないか確認しましょう。
WindowsUpdateを少しでも楽に実行できるよう改善を続けましょう。