2010/07/06

Windows Scripting: Windows Update をリモートから ( PowerShell Remoting は NG )

前回、PowerShell で動く Windows Update スクリプト (WindowsUpdate.ps1) を紹介しました。今回は、これを PowerShell 2.0 の新機能である PowerShell Remoting と組み合わせてみます。これが成功すれば、Hyper-V ホストの仮想マシンを起動して、更新し、シャットダウンまたは保存するというタスクをホスト側からスクリプトで自動化できます。しかし、結論から言うと、挫折しました。

PowerShell Remoting は Invoke-Command や Enter-Pssession コマンドレットを使用して、WinRM 経由で 1 台以上のリモート コンピューター のシェルに接続し、スクリプトを実行して、ローカルのコンソールに結果を返すという機能です。仮想マシンを更新するために、次のようなバッチファイルを思い描いていました。

[updatevmbatch.cmd]
@echo off

cscript hvvmstart2up.vbs win7ep01.contoso.com
powershell invoke-command -computername win7ep01.contoso.com -filepath C:\tools\windowsupdate.ps1
cscript hvvmstart2up.vbs win7ep02.contoso.com
powershell invoke-command -computername win7ep02.contoso.com -filepath C:\tools\windowsupdate.ps1
cscript hvvmstart2up.vbs win7ep01.contoso.com
powershell invoke-command -computername win7ep01.contoso.com -filepath C:\tools\windowsupdate.ps1
cscript hvvmstart2up.vbs win7ep03.contoso.com
powershell invoke-command -computername win7ep03.contoso.com -filepath C:\tools\windowsupdate.ps1
hvvmstart2up.vbs はこちらから、windowsupdate.ps1 は前回の投稿から

PowerShell Remoting のためには、リモート接続を受け入れる側で enable-psremoting コマンドレットを実行して、WinRM サービスやファイアウォールの構成を済ませておきます。

Hyper-V ホスト側では、PowerShell のシェルを「管理者として実行」で開きます。

まずは、ホストから実行中の仮想マシン (Windows 7 Enterprise ゲスト) に対して、手動で invoke-command を実行してみます。

invoke-command -computername <仮想マシンのゲスト OS のコンピューター名> -filepath <ホスト側にあるスクリプトのパス>

更新プログラムの検索まではうまくいきます。しかしその後のダウンロードとインストールはエラーになります。エラーは、次のようなものです。

"0" 個の引数を指定して "CreateUpdateDownloader" を呼び出し中に例外が発生しました: "アクセスが拒否されました。(HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))
"0" 個の引数を指定して "CreateUpdateInstaller" を呼び出し中に例外が発生しました: "アクセスが拒否されました。(HRESULT からの例外: 0x80070005 (E_ACCESSDENIED))
このエラーは、WindowsUpdate.ps1 をローカルで非管理者権限で実行した場合と同じもののようです。リモート UAC (ユーザー アカウント制御) がからんでいるのかと思い、LocalAccountTokenFilterPolicy を設定してみたり、Invoke-Command を -Credential 付で実行したりしてみましたが、解消できませんでした。インターネットで「CreateUpdateDownloader Access Denied」を検索すると、同様のトラブルに悩む人は多いようです。

ちなみに、UAC を搭載していない Windows XP に PowerShell 2.0 (http://support.microsoft.com/kb/968929/ja) をインストールして試してみましたが、NG でした。どうやら、UAC とは関係なさそうです。

PowerShell Remoting でうまくいかないとなると、あとはスクリプトをゲスト OS 側に配置しておいて、何らかの方法でキックするしかなさそうです。たとえば、スクリプトをタスクに登録しておいて PowerShell Remoting などでタスクを開始するとか。試行錯誤は続きます。

2 件のコメント:

匿名 さんのコメント...

ポートを開ける必要があるみたいですが、こちらは試されましたか?
http://msdn.microsoft.com/en-us/library/aa387288(v=vs.85).aspx

山市 良 さんのコメント...

コメントありがとうございます。

古い投稿なので、その後、この試みはフォローしておりませんが、このエラーとファイアウォールのポート要件は関係ないと思います。リモート管理のためにRPCポートは開いていますし、ファイアウォールに疑いがあるときはファイアウォールをオフにして試すはずなので...