Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード

更新プログラムを検索、ダウンロード、およびインストールする方法はありますか

 

Scripting Guy さん、よろしくお願いします。Windows Update がインストールされているかどうかが報告されることは、とてもすばらしいことです。しかし、更新プログラムが適用されていないことがわかったら、ユーザーに電話をかけて、Microsoft Update サイトに接続して適切な更新プログラムを適用するように、詳しく説明しなければならないのでしょうか。この方法はユーザーが 1 ~ 2 人の場合はうまくいくかもしれませんが、人数が多くなると対応できません。Scripting Guy さんならきっと、もっといい方法をご存じですよね。ユーザーに GUI の説明を行う Microsoft GUI Guy ではなく、Microsoft Scripting Guy なのですから。このような処理を行うスクリプトはありますか。

- NB

NB さん、こんにちは。

今日のシャーロットは、雪で覆われています。大雪のため、会社や学校は休みです。大喜びしたいところですが、私は自宅で仕事をするので、結局、あまり関係ありません。まあ、仕方ありませんね。仕事部屋の窓から眺める景色はきれいで、通りにいる近所の人々はさまざまな防寒具を身にまとっています。とても寒そうです。幸運にも、私は Bigelow 社の Constant Comment ティーをすすりながら、Zune に入っている Kentucky Headhunters の曲を聴いています。さて、NB さんは更新プログラムを検索し、ダウンロードして、インストールできるようにしたいということですが、問題ありません。

今週は、Windows Update API を使用して Windows Update を操作する方法について説明します。Windows Update API については、MSDN (英語) でドキュメントが公開されています。スクリプト センターの「スクリプト一覧」では、Windows Update API を使用する VBScript をまとめて提供しています。ワークステーションで Windows Update を手動で構成する方法については、こちらのページ (英語) を参照してください。今週紹介するスクリプトでは、Windows PowerShell を使用します。Windows PowerShell 初心者向けのページでは、Windows PowerShell の習得と Windows PowerShell のダウンロードに関する基本情報を提供しています。

今日紹介するスクリプトは、次に示す InstallSoftwareUpdate.ps1 というスクリプトです (今日紹介するスクリプトの VBScript バージョンは、「スクリプトの一覧」の「更新プログラムのインストール」で確認できます)。

PowerShell
$UpdateCollection = New-Object -ComObject Microsoft.Update.UpdateColl 
$Searcher = New-Object -ComObject Microsoft.Update.Searcher 
$Session = New-Object -ComObject Microsoft.Update.Session 
 
$updateID = "f1b1a591-bb75-4b1c-9fbd-03eedb00cc9d" 
$Result = $Searcher.Search("UpdateID='$updateID'") 
$Updates = $Result.updates 
$UpdateCollection.Add($Updates.Item(0)) | out-null 
 
$Downloader = $Session.CreateUpdateDownloader() 
$Downloader.Updates = $UpdateCollection 
$Downloader.Download() 
 
$Installer = New-Object -ComObject Microsoft.Update.Installer 
$Installer.Updates = $UpdateCollection 
$Installer.Install()
 

まず、Microsoft.Update.UpdateColl オブジェクトのインスタンスを作成する必要があります。Microsoft.Update.UpdateColl オブジェクトは、IUpdateCollection インターフェイスと呼ばれます。このオブジェクトについては、MSDN (英語) でドキュメントが公開されています。UpdateColl オブジェクトを作成するには、New-Object コマンドレットを使用して、–ComObject パラメーターを指定し、Microsoft.Update.UpdateColl というプログラム ID を使用します。こうしたオブジェクトを作成するパターンを次に示します。

PowerShell
$VariableToHoldObject = New-Object –ComObject ProgramIDOFTheComObject
 

返された UpdateColl オブジェクトは、次のように $UpdateCollection 変数に格納します。

PowerShell
$UpdateCollection = New-Object -ComObject Microsoft.Update.UpdateColl
 

続いて、Searcher オブジェクトを作成する必要があります。Microsoft.Update.Searcher オブジェクト (別称、IUpdateSearcher インターフェイス) については、MSDN (英語) でドキュメントが公開されています。Searcher オブジェクトを作成するには、New-Object コマンドレットを使用して、–ComObject パラメーターを指定し、Microsoft.Update.Searcher というプログラム ID を指定します。返された Searcher オブジェクトは、$Searcher 変数に格納します。この処理を実行するコード行を次に示します。

PowerShell
$Searcher = New-Object -ComObject Microsoft.Update.Searcher
 

次に、Session オブジェクトを作成する必要があります。他の 2 つのオブジェクトと同様に、Session オブジェクトの先頭の文字列も Microsoft.Update です。このオブジェクトも New-Object コマンドレットを使用して作成します。IUpdateSession インターフェイスとも呼ばれるこのオブジェクトについては、MSDN (英語) でドキュメントが公開されています。Session オブジェクトを作成するコードを次に示します。

PowerShell
$Session = New-Object -ComObject Microsoft.Update.Session
 

ソフトウェア更新プログラムをインストールするには、まず、更新プログラムを検索し、見つかった更新プログラムを更新プログラムのコレクションに追加します。次に、更新プログラムをダウンロードして、最後にインストールします。特定の更新プログラムをインストールする場合は、Update Identity オブジェクトの updateID プロパティを使用できます。まだインストールされていないソフトウェア更新プログラムの updateID プロパティを簡単に取得するには、次に示す ListSoftwareUpdatesNotInstalled.ps1 スクリプトを使用できます (このスクリプトは、昨日のコラムで紹介した ListSoftwareUpdates.ps1 スクリプトの改訂版です)。

PowerShell
$Searcher = New-Object -ComObject Microsoft.Update.Searcher 
$results = $searcher.search("Type='software' AND IsInstalled = 0") 
$Results.Updates |  
ForEach-Object { $_.Identity.UpdateID ; "`t" + $_.Title }
 

このスクリプトでは、ForEach-Object コマンドレットを追加して、Update Identity オブジェクトの updateID プロパティが返されるようにしました。その後、"`t" を使用してタブで区切り、プラス記号 (+) によって更新プログラムのタイトルを連結することで、タイトルも出力しています。スクリプトの実行結果は、次のとおりです。

 

インストールする更新プログラムが見つかったら、updateID プロパティの値をコピーして、$UpdateID 変数に代入します。この変数は、Searcher オブジェクトで Search メソッドを呼び出すときに使用します。Searcher オブジェクトでは、"updateID = $updateID 変数に格納される値" のような形式のクエリを使用します。Searcher の構文については、昨日の Hey, Scripting Guy! コラムで説明したとおりです。

更新プログラムが見つかったら、Add メソッドを使用して UpdateCollection に追加されます。コレクションに更新プログラムを追加する処理によって生成されるリターン コードは、Out-Null コマンドレットにパイプライン処理されて破棄されます。f1b1a591-bb75-4b1c-9fbd-03eedb00cc9d という updateID プロパティの値は、Windows XP 向け Windows Search 4.0 (KB940157) 更新プログラムのものです。スクリプトの該当するセクションを次に示します。

PowerShell
$updateID = "f1b1a591-bb75-4b1c-9fbd-03eedb00cc9d" 
$Result = $Searcher.Search("UpdateID='$updateID'") 
$Updates = $Result.updates 
$UpdateCollection.Add($Updates.Item(0)) | out-null
 

次は、更新プログラムをダウンロードする必要があります。この処理を行うには、Session オブジェクトで CreateUpdateDownloader メソッドを使用します。作成されたダウンロード オブジェクトは、$Downloader 変数に格納します。$UpdateCollection 変数に格納されている更新プログラムが、Downloader の Updates プロパティに代入され、Download メソッドが呼び出されます。スクリプトの該当するセクションを次に示します。

PowerShell
$Downloader = $Session.CreateUpdateDownloader() 
$Downloader.Updates = $UpdateCollection 
$Downloader.Download()
 

では、更新プログラムのインストールに移ります。この処理を行うには、まず、Installer オブジェクトのインスタンスを作成する必要があります。Installer オブジェクト (別称、IUpdateInstaller インターフェイス) については、MSDN (英語) でドキュメントが公開されています。Installer オブジェクトを作成したら、$UpdateCollection 変数に格納されている更新プログラムを使用し、その更新プログラムを Updates プロパティに代入します。その後、次のように、Install メソッドを呼び出します。

PowerShell
$Installer = New-Object -ComObject Microsoft.Update.Installer 
$Installer.Updates = $UpdateCollection 
$Installer.Install()
 

スクリプトの実行後、次のような結果が画面に出力されます。

 

上記の画像に表示されている HResult は、インストール中に発生した COM エラーまたは Windows エラーを示します。ResultCode は、OperationResultCode 列挙値です。ResultCode の値が 2 の場合、操作が成功したことを意味します。最初の結果セットは Download メソッドの操作によって返されたもので、2 つ目の結果セットは Install メソッドの操作によって返されたものです。結果コードを表 1 に示します。

表 1: OperationResultCode 列挙値と意味
戻り値 意味

0

開始されていません

1

処理中です

2

成功しました

3

完了しましたが、エラーが発生しました

4

失敗しました

5

中断されました

インストールまたはダウンロード中に問題が発生した場合、Installation Results オブジェクト (IInstallationResult インターフェイス) では、スクリプトのトラブルシューティングに役立つ情報を提供することがあります。そのようなエラーの例を次に示します。

 

スクリプトから返される Installation Results オブジェクトの HResult プロパティについては、MSDN (英語) でドキュメントが公開されています。結果の値を検索できる数値に変換するには、まず、値を 16 進数に変換する必要があります。この処理を行うには、電卓 (Calc.exe) プログラムを使用できます。ここでは、Windows PowerShell コンソールから -2145124318 という値をコピーして、電卓に貼り付けます。その作業を行った後の電卓は、次のようになります。

 

HResult プロパティの値を検索できる数値に変換するために、ここで数値を 16 進数に変換する必要があります。次のように、[16 進] をクリックして、[Dword] をクリックします。

 

計算結果の 80240022 という数値は、MSDN ドキュメント (英語) でそのまま検索できます。このドキュメントによると、80240022 という数値は、すべての更新プログラムで操作が失敗したことを意味します。その他の情報については、システム イベント ログで確認できます。イベント ログのソースは、Windows Update Agent です。次の画像に表示されている例では、0x80246007 というエラーが報告されています。つまり、先ほどの MSDN ドキュメントで検索するとわかるように、更新プログラムがダウンロードされていません。

 

NB さん、Windows 更新プログラムのインストールについてお伝えできることは、これで全部です。ニットの服を着込んで、雪遊びに出かけようと思います。この地域で雪が降るのは珍しく、しかも 15 cm 積もるのは、とにかく珍しいことです。これでは、学校や会社が休みになるのも当然ですね。Windows 更新プログラム週間は続きます。また明日お会いしましょう。それまでの間、しばしのお別れです。

 

Scripting Guys (Ed WilsonCraig Liebendorfer)


ページのトップへ