PowerShellによるWindows7のWindowsUpdate自動化

前回、サーバでWindowsUpdateを自動実行したのですが、Windows7でも実施したので備忘録。
毎月Update状況の報告を求められるのですが、求められてからやっていると仕事が止まるのでこの際自動化しておこうと。

クライアントOSでは、PowerShellの実行ポリシーがサーバと異なるようだったので、まずはそこから。

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をしてやります。

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以上で利用可、となっています。
バージョンを調べてみると…

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
インストールして再起動します。念のためバージョンを確認。

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になっています。
コマンドプロンプトを管理者として起動し、自動実行させる予定のコマンドを動かしてみます。

C:\Windows\system32>%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe 
-Command Get-WUInstall -AcceptAll -AutoReboot

 

Windows7で-AcceptAllオプションで実行した結果

ServicePack1のギリシア語パックとかダウンロードし始めたので、Ctrl+Break(笑)

どうやら、-AcceptAllだと重要な更新のほか、オプションの更新もインストールしてしまうようです。
サーバなのでそもそもオプションの更新が配信されなかったので気づきませんでした(^_^;

重要な更新(自動選択されるもののみ)に変更するべくオプションを探したところ、-AutoSelectOnlyが該当するようです。

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の方がベター

実行タイミングはそれぞれの環境でご検討ください。

 

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA


This site uses Akismet to reduce spam. Learn how your comment data is processed.