PSWindowsUpdate – コマンドラインで Windows Update –

コマンドラインからのWindows Updateは山市氏が紹介されているvbsを使ってきた。
Windows Scripting: Windows Update をスクリプトから ( WindowsUpdate.vbs )
2010/07の記事
Windows Scripting: Windows Update をリモートから ( PowerShell Remoting は NG )
2010/07の記事
このスクリプトWin7時代は大変重宝したのだけれど、Win8/Win8.1/Win2012(R2)では相性がよろしくないようで、更新を取りこぼすことがあった。

これに代わるものとして、PSWindowsUpdateというものを見つけたので導入してみたメモ。

注意

PSWindowsUpdate経由でWindows Updateを行った場合、正規のGUIで行うアップデートとのあいだで不整合が発生します。これにより、システムのプロパティ->システムの保護でシステムの復元が出来なくなる可能性があります。

おおまかな手順

  1. Chocolateyのインストール
  2. PSWindowsUpdateのインストール
  3. PSWindowsUpdateモジュールのインポート
  4. アップデート実行

初回ハマりやすい点を、次のように斜体+ラインマークした。

cmd.exeとPowerShell.exe上でのクリップボードペーストはAlt + Space → E → P
(正確にクリップボードバッファを捉えないときあり。)

確認事項:実行ポリシー

PS C:> Get-ExecutionPolicy
RemoteSignedに設定する場合
PS C:> Set-ExecutionPolicy RemoteSigned

(初期値Restricted、詳しい解説はここ)

Step1:Chocolateyのインストール

cmd.exeから (以下を貼り付けリターン、プロンプトの部分は除く)

C:> @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%systemdrive%chocolateybin

Chocolatey

Step2:Windows Update PowerShell Moduleのインストール

powershell.exe、cmd.exeどちらでも

C:> cinst PSWindowsUpdate

ここで一旦ログアウトし、パスを反映さたほうがいいかもしれない。殆どのマシンは必要ない。

Step3: $env:PSModulePath でモジュールのパスを確認

powershell.exe

C:> $env:PSModulePath
C:> $env:PSModulePath
C:UsersAdministratorDocumentsWindowsPowerShellModules;C:Program Files (x86)WindowsPowerShellModules;C:Windows
system32WindowsPowerShellv1.0Modules


PSWindowsUpdate.ps1をシステムにコピー。ただし、実行環境がサーバでない場合は、コピー不要、ユーザディレクトリのままでおそらくは大丈夫。

%USERPROFILE%DocumentsWindowsPowerShellModule に置けばOKという解説があるが、Windows Server 2012 R2 ではシステムディレクトリ( C:WindowsSystem32WindowsPowerShellv1.0Modules )に置かないと動作しなかった。また、マシンによって、C:WindowsSysWOW64WindowsPowerShellv1.0Modules というディレクトリに配置されることがある。理由は不明。SysWOW64は64bitOSが32bit命令をエミュレートするときのバイナリ群だが配下では動作しない。

要は C:WindowsSystem32WindowsPowerShellv1.0Modules 内にPSWindowsUpdateのディレクトリとアップデートps1(Get-WUList.ps1、Get-WUInstall.ps1等々)のファイルがあればどんなマシンでも動作する。手段は手動コピーでも可。

インストールされた先がどこか分からなくなった場合は、エクスプローラ等で PSWindowsUpdate を検索かけてみる。

上手くいかず手順を追うときは、アイコン右クリックで管理者モードでpowershell.exeを起動。手順を確認。

Step4: モジュールのImport

C:> Import-Module PSWindowsupdate

Step5: 動作確認

C:> Get-Command -Module PSWindowsupdate
C:> Get-Command -Module PSWindowsupdate

CommandType Name ModuleName
----------- ---- ----------
Function Add-WUOfflineSync pswindowsupdate
Function Add-WUServiceManager pswindowsupdate
Function Get-WUHistory pswindowsupdate
Function Get-WUInstall pswindowsupdate
Function Get-WUInstallerStatus pswindowsupdate
Function Get-WUList pswindowsupdate
Function Get-WURebootStatus pswindowsupdate
Function Get-WUServiceManager pswindowsupdate
Function Get-WUUninstall pswindowsupdate
Function Hide-WUUpdate pswindowsupdate
Function Invoke-WUInstall pswindowsupdate
Function Remove-WUOfflineSync pswindowsupdate
Function Remove-WUServiceManager pswindowsupdate
Function Update-WUModule pswindowsupdate

Step6: 完了、Windows Updateを試す

powershell.exe

C:> Get-WUList
-------------------
C:> Get-WUInstall
-------------------


2行でWindows Update終わり。

対話なし全部受け入れ、かつ再起動OKの場合はこれで

PS C:> Get-WUInstall -AcceptAll -AutoReboot

できたー!

参考:
PowerShellをMicrosoft Updateに対応させ,historyをセッションを超えて保存できるようにする
(直立二速歩行
【Management】Windows Update Powershell Module (1)
(フィールドSEあがりの安納です

おまけ

PowerShellでリモート接続

手順

  1. (サーバ側で)Enable-PSRemoting
  2. (クライアント側で)WinRMクイック構成を有効にする、ドメイン外にのサーバに対しては信頼ホストを登録 “Set-Item wsman:localhostClientTrustedHosts <サーバIP>”  
  3. (クライアント側で)enter-pssession -ComputerName サーバ名 -Credential サーバ名ユーザ名

※Windows Server 2012 R2 Essentialsのようにサーバがドメインに参加しているときは(ドメイン名)(ユーザ名)

参考

PowerShellでリモートPCの操作を行うに為にEnable-PSRemotingをするための準備
PowerShell 2.0 ヒント集 > Windows PowerShell でリモート コマンドを有効にして使用する
seraphy / gist:4750882
Windows PowerShell 3.0 RC による Windows Server 2012 管理の自動化

Microsoft.Update.Session 関連:
おまえとその犬の命はないからね…Windows Update も管理しましょう (TechNet)
Hey, Scripting Guy! コンピューターに追加されたすべての更新プログラムの一覧を取得する方法はありますか (TechNet)
Scripting Guy さん、Windows Update の最新の更新プログラムがいつ適用されたかを判断する方法はありますか (TechNet)
Windows Update PowerShell Module MichalGajda氏 (TechNet)

以上