WUA (Windows Update Agent) APIをPowerShellから利用して、WindowsUpdateを自動化するスクリプトを用意しました。
PowerShell
1$sess = new-object -com "Microsoft.Update.Session" 2$search = $sess.Createsearch() 3$result = $search.Search("IsInstalled=0 and Type='Software' and AutoSelectOnWebSites=1") 4if ($result.Updates.Count -eq 0) { 5 Write-Host "There are no applicable updates." 6} 7else 8{ 9 $updCol = new-object -com "Microsoft.Update.UpdateColl" 10 foreach ($update in $result.Updates){ 11 $updCol.Add($update) | out-null 12 } 13 $downloader = $sess.CreateUpdateDownloader() 14 $downloader.Updates = $updCol 15 $downloader.Download() 16 $updatesToInstall = new-object -com "Microsoft.Update.UpdateColl" 17 foreach ($update in $result.Updates){ 18 if ( $update.IsDownloaded ) { 19 $updatesToInstall.Add($update) | out-null 20 } 21 } 22 if ( $updatesToInstall.Count -eq 0 ) { 23 Write-Host "Not ready for installation." 24 } 25 else { 26 $installer = $sess.CreateUpdateInstaller() 27 $installer.Updates = $updatesToInstall 28 $installationResult = $installer.Install() 29 if ( $installationResult.ResultCode -eq 2 ) { 30 Write-Host "All updates installed successfully." 31 } 32 else { 33 Write-Host "Some updates could not installed." 34 } 35 if ( $installationResult.RebootRequired ) { 36 Write-Host "One or more updates are requiring reboot." 37 } 38 else { 39 Write-Host "Finished. Reboot are not required." 40 } 41 } 42}
これをローカルPCで実行すると成功するのですが、WinRMを利用してリモートPCで実行すると失敗します。
失敗のメッセージは、次の通りです。
PowerShell
1"0" 個の引数を指定して "CreateUpdateDownloader" を呼び出し中に例外が発生しまし 2た: "アクセスが拒否されました。 (HRESULT からの例外: 0x80070005 (E_ACCESSDENIED 3))" 4 + CategoryInfo : NotSpecified: (:) [], MethodInvocationException 5 + FullyQualifiedErrorId : ComMethodTargetInvocation 6 + PSComputerName : testserver 7 8このオブジェクトにプロパティ 'Updates' が見つかりません。プロパティが存在し、設 9定可能なことを確認してください。 10 + CategoryInfo : InvalidOperation: (:) []、RuntimeException 11 + FullyQualifiedErrorId : PropertyNotFound 12 + PSComputerName : testserver 13 14null 値の式ではメソッドを呼び出せません。 15 + CategoryInfo : InvalidOperation: (:) []、RuntimeException 16 + FullyQualifiedErrorId : InvokeMethodOnNull 17 + PSComputerName : testserver
最初の"CreateUpdateDownloader"に失敗しているのがすべての原因だと思うのですが、これが何故失敗するのかがわかりません。
他のPowerShellスクリプトは成功するので、WinRMの設定に問題は無いと思っています。
実行に成功したスクリプトは、次のものです。
Powershell
1$Session = New-Object -ComObject Microsoft.Update.Session 2$Searcher = $Session.CreateUpdateSearcher() 3$HistoryCount = $Searcher.GetTotalHistoryCount() 4$Searcher.QueryHistory(1,$HistoryCount) | ft title
このことから、WinRM経由で実行すると、何故か"CreateUpdateDownloader"だけがアクセスエラーで失敗するということなのですが、原因がわかりません。
リモートPCとローカルPCは、同じドメインに所属し、同じドメインアカウントを使用しています。
ネットで少し検索すると、「タスクスケジューラーで実行してください。」と見つかるのですが、Update処理が終わった後も、続けて処理を行いたいため、できればその方法は採用したくないと考えています。
何か良い回避方法があれば教えていただけないでしょうか。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。