コマンドラインからの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で行うアップデートとのあいだで不整合が発生します。これにより、システムのプロパティ->システムの保護でシステムの復元が出来なくなる可能性があります。
おおまかな手順
- Chocolateyのインストール
- PSWindowsUpdateのインストール
- PSWindowsUpdateモジュールのインポート
- アップデート実行
初回ハマりやすい点を、次のように斜体+ラインマークした。
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
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でリモート接続
手順
- (サーバ側で)Enable-PSRemoting
- (クライアント側で)WinRMクイック構成を有効にする、ドメイン外にのサーバに対しては信頼ホストを登録 “Set-Item wsman:localhostClientTrustedHosts <サーバIP>”
- (クライアント側で)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)
以上