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 は前回の投稿から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
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 などでタスクを開始するとか。試行錯誤は続きます。
ポートを開ける必要があるみたいですが、こちらは試されましたか?
返信削除http://msdn.microsoft.com/en-us/library/aa387288(v=vs.85).aspx
コメントありがとうございます。
返信削除古い投稿なので、その後、この試みはフォローしておりませんが、このエラーとファイアウォールのポート要件は関係ないと思います。リモート管理のためにRPCポートは開いていますし、ファイアウォールに疑いがあるときはファイアウォールをオフにして試すはずなので...