PowerShellによるWindows7のWindowsUpdate自動化
前回、サーバでWindowsUpdateを自動実行したのですが、Windows7でも実施したので備忘録。
毎月Update状況の報告を求められるのですが、求められてからやっていると仕事が止まるのでこの際自動化しておこうと。
クライアントOSでは、PowerShellの実行ポリシーがサーバと異なるようだったので、まずはそこから。
1 2 3 4 5 6 7 8 9 |
PS PS C:\windows\system32> Get-ExecutionPolicy Restricted PS PS C:\windows\system32> Set-ExecutionPolicy RemoteSigned 実行ポリシーの変更 実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170) で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか? [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): y |
前回と同じくWindows Update PowerShell ModuleからPSWindowsUpdate.zipをダウンロードします。
PSWindowsUpdate.zipをPowerShellのパスが通っているところに展開し、Import-Moduleをしてやります。
1 2 3 4 5 6 |
PS C:\Windows\system32> import-module PSWindowsUpdate 用語 'Unblock-File' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。 発生場所 C:\Windows\system32\WindowsPowerShell\v1.0\Modules\PSWindowsUpdate\PSWindowsUpdate.psm1:1 文字:49 + Get-ChildItem -Path $PSScriptRoot | Unblock-File <<<< + CategoryInfo : ObjectNotFound: (Unblock-File:String) []、CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException |
検索すると、Unblock-FileコマンドレットはPowerShell 3.0以上で利用可、となっています。
バージョンを調べてみると…
1 2 3 4 5 6 7 8 9 10 11 |
PS C:\Windows\system32e>> $PSVersionTable Name Value ---- ----- CLRVersion 2.0.50727.8762 BuildVersion 6.1.7601.17514 PSVersion 2.0 WSManStackVersion 2.0 PSCompatibleVersions {1.0, 2.0} SerializationVersion 1.1.0.1 PSRemotingProtocolVersion 2.1 |
確かに2.0でした。画面の構成が違うなぁとは思ってたんだ←
ということで、サーバのテスト環境にしてしまうべくサーバと同じPowerShell4.0を導入することにします。
下記のページからWindows Management Framework 4.0をダウンロード
Windows Management Framework 4.0
インストールして再起動します。念のためバージョンを確認。
1 2 3 4 5 6 7 8 9 10 11 |
PS C:\Windows\system32> $PSVersionTable Name Value ---- ----- PSVersion 4.0 WSManStackVersion 3.0 SerializationVersion 1.1.0.1 CLRVersion 4.0.30319.42000 BuildVersion 6.3.9600.16406 PSCompatibleVersions {1.0, 2.0, 3.0, 4.0} PSRemotingProtocolVersion 2.2 |
無事4.0になっています。
コマンドプロンプトを管理者として起動し、自動実行させる予定のコマンドを動かしてみます。
1 2 |
C:\Windows\system32>%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -Command Get-WUInstall -AcceptAll -AutoReboot |
ServicePack1のギリシア語パックとかダウンロードし始めたので、Ctrl+Break(笑)
どうやら、-AcceptAllだと重要な更新のほか、オプションの更新もインストールしてしまうようです。
サーバなのでそもそもオプションの更新が配信されなかったので気づきませんでした(^_^;
重要な更新(自動選択されるもののみ)に変更するべくオプションを探したところ、-AutoSelectOnlyが該当するようです。
1 2 |
C:\Windows\system32> %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -Command Get-WUInstall -AutoSelectOnly -AutoReboot |
順調に進んでるな、と思ったら再起動を促すプロンプトが出て止まりました。
ソースを見る限りは、再起動が必要な状態になったらRestart-Computerコマンドレットを流すので自動再起動だと思ったのですが、Windows7のつくりが違うのか予想外の挙動をします。
タスクスケジューラに登録したら挙動が違うかも、と思いタスクスケジューラに登録してやります。
タスクスケジューラへの登録
タスクの作成をして、全般タブでは以下を設定します。
- ユーザーがログオンしているかどうかにかかわらず実行するにチェック
- タスクの実行時に使うユーザーアカウントを「SYSTEM」に変更
- 最上位の特権で実行する
操作タブに移って「新規(N)」を選択します。
- プログラム/スクリプト欄に以下を入力
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe - 引数欄に以下を入力
-Command Get-WUInstall -AutoSelectOnly -AutoReboot
トリガータブに移って「新規(N)」を選択します。
前回、実行の結果エラーが起こったUpdateがあったので、再起動とUpdate実行を繰り返しさないと完了しませんでした。間に再起動が入ると制御ファイルかなにかでControlしてやらないと行けないのですが、そこまですることも無いので「毎日夜間に実施」にしておくことにしました。
Microsoftの配信タイミングは「米国時間の第二水曜日」なので日本時間だと第二水曜日だったり第三水曜日だったりするのですよ(^_^;
- 設定を毎日にする
- 開始を開始日の午前3時にして間隔を1日にする
出来上がったタスクを手動実行した所、自動再起動されました。でもクライアントOSで自動再起動は扱いに困りますね(^^;
Windows7はテスト環境として手動実行・サーバOSは毎晩3時に実行することにして、しばらく様子を見ることにします。
まとめ
- PSWindowsUpdateはWindows7でも利用可能
- ただし、PowerShellは3.0以上対応なのでWindows Management FrameworkをUpdateする
- -AcceptAllオプションはクライアントOSだと不必要なUpdateもインストールされるので、
-AutoSelectOnlyの方がベター
実行タイミングはそれぞれの環境でご検討ください。