質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

5923閲覧

リモートPCへのWindowsUpdate実行に失敗する

shanxia

総合スコア1038

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2015/11/19 01:18

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処理が終わった後も、続けて処理を行いたいため、できればその方法は採用したくないと考えています。

何か良い回避方法があれば教えていただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

明確な解決方法は見つかりませんでしたが、MSのMVPの人が作成したコマンドレットでUpdateするスクリプトを導入して、擬似的に解決させました。

スクリプトセンター

投稿2016/01/12 01:42

shanxia

総合スコア1038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問