SCE / WSUS :今すぐに更新ファイルやソフトウェアをインストールしたい その2 検索編

WSUS の API を使用して更新ファイルを検索するには、以下のようなコードを使用します。

拡張子 vbs でテキストファイルとして保存し、コマンドプロンプトより以下の書式で実行してください。

cscript hogehoge.vbs

インラインで解説を入れておきますので参考にしてください。

' WSUS のクライアントエージェントを使用した管理を行う場合には、ここからはじまります。' UpdateSessionオブジェクトが、基点のオブジェクトとなります。' ここでは、UpdateSession オブジェクトを、objUpdateSession という名前で取得します。 Set objUpdateSession = CreateObject("Microsoft.Update.Session") ' 検索をするにあたり、検索用のオブジェクト(Searcher オブジェクト)を取得しておきます。' 検索用のオブジェクトは、Microsoft.Update.Session オブジェクトの ' CreateUpdateSearcher メソッドで取得します。Set objUpdateSearcher = objUpdateSession.CreateupdateSearcher( )WScript.Echo "更新ファイルを検索しています..."

' Searcherオブジェクトで検索する際に、条件を付けることができます。' 与えられえる条件は、https://msdn2.microsoft.com/en-us/library/aa386526.aspx を' 参照してください。' 今回は、「インストールされていない更新ファイル」ということで、IsInstall = 0 を指定します。strSeatchCondition = "IsInstalled=0" ' 以下はコメントアウトしていますが、Typeを指定することで、ソフトウェアなのかドライバ' なのかを指定して絞り込むことも可能です。' strSeatchCondition = "IsInstalled=0 and Type='Software' "' strSeatchCondition = "IsInstalled=0 and Type='Driver' "' Windows Updateサイトまたは、グループポリシーで指定された ' WSUS のサイトにアクセスして検索を行います。' 検索結果は、SearchResult オブジェクトとして返されます。Set objSearchResult = objUpdateSearcher.Search( strSeatchCondition )

Wscript.Echo WScript.Echo "未適用の更新ファイル一覧"Wscript.Echo "-------------------------------------------------"Wscript.Echo "見つかった更新ファイルの数:" & objSearchResult.Updates.CountWscript.Echo

' ここからは、スクリプトに慣れていない方は、ちょいと難しいかもしれません。' でも、我慢です。我慢して読んでみてください。' まずは、以下に掲載した図をご覧ください。' https://blogs.technet.com/junichia/archive/2007/08/31/Update_5F00_INSTALL_5F00_NOW.aspx ' SearchResult オブジェクト配下には さらに 3つのオブジェクトがありますよね。' その中の1つ、UpdateCollection オブジェクトの中に更新ファイルの一覧が' 格納されています。' なんでそんなことがわかるのか...それは勉強したからです。' では、UpdateCollection オブジェクトを取得すにはどうするか...というと、' Update プロパティというものを使用します。なんでそんなことがわかるのか?' それは、以下のページに書かれているからです。' https://msdn2.microsoft.com/en-us/library/aa386077.aspx' collection of updates (つまりUpdateCollection オブジェクト)を取得するための' プロパティとして、Updates が用意されていることがわかります。' ' では、Updates プロパティの説明を見てみましょう。以下のページです。' https://msdn2.microsoft.com/en-us/library/aa386081.aspx' このページによれば、Updates プロパティによって、UpdateCollection という' コレクション型のオブジェクトが返されると書いてあります。Set objUpdateCollection = objSearchResult.Updates' コレクション型ということは、複数の値を格納するための型であることは、' うすうす感ずくことができますよね。そんな感覚で UpdateCollection オブジェクト' の説明を見てみると、Count というプロパティがあることがわかります。' なんとなく、格納されている値の個数であろうことが想像つきます。' そこで、おなじみの、For ~ Next 文を使用して、UpdateCollection オブジェクト' ( objUpdateCollection )から1つづつ値を取ってみます。For i = 0 To objUpdateCollection.Count-1 strType = "" strCategory = "" strTitle = "" strDescription = "" ' さて、実際に値を取るにはどうしたらよいか...Item というプロパティを使います。 ' 面倒ですが仕方ありません。そう設計されているので、ここも我慢しましょう。 ' なお、Item プロパティによって返されるのは単純な文字列でないことに注意して ' ください。https://msdn2.microsoft.com/en-us/library/aa386114.aspx によれば、 ' Update オブジェクトと呼ばれるものが返されます。 ' Item には、「objUpdateCollection の中の何番目の情報が欲しいのかを ' 引数で指定する必要があります。「何番目」を表すのがカウンタ「 i 」ですね。 ' つまり、objUpdateCollection オブジェクトは、Update オブジェクトの集合体という ' ことです。折り詰めの中の握り寿司みたいなものです。 ' 以下では、Update オブジェクトを、objUpdate という名前で取得しています。 Set objUpdate = objUpdateCollection.Item( i )

' さて、やっと情報を取得できる段階にこぎつけました。 ' どんな情報が取れるのか...これは、以下のページに掲載されています。 ' https://msdn2.microsoft.com/en-us/library/aa386099.aspx ' MSDNって、IT Proにとっても情報の宝庫ですねぇ。 ' まずは、更新ファイルのタイプから取ってみます。 Select Case objUpdate.Type Case 1 strType = "Software" Case 2 strType = "Driver" Case Else strType = "NA" End Select

' 次に、更新ファイルのカテゴリです。重要なのか、単なる更新なのか、 ' はたまた、Office向けなのか、Windows Vista向けなのか といった情報です。 ' で、このカテゴリなのですが、こいつもコレクションなんです。 ' なので、一度Categoriesオブジェクトを取得し、こいつからループで値を取り出す ' 必要がありますので注意してください。 Set objCategories = objUpdate.Categories For cntCategory = 0 to objCategories.Count - 1 strCategory = strCategory & "[" & objCategories.Item(cntCategory) & "]" Next

' 更新ファイルの説明もとっておきましょう。Description というプロパティで取れます。 ' これは戻り値が文字列なので楽ですね。 strDescription = objUpdate.Description

' いろいろとりすぎるとキリが無いので、これで最後にしておきます。 ' 更新ファイルの名前です。一番重要な情報ですね。 ' これは、Title というプロパティで取得できます。 strTitle = objUpdate.Title

' 取得した値を、Echo で画面に出力しています。 WScript.Echo strTitle Wscript.Echo " タイプ " & chr(9) & ":" & strType Wscript.Echo " カテゴリ " & chr(9) & ":" & strCategory Wscript.Echo " 説明 " & chr(9) & ":" & strDescription Wscript.Echo

Next' もし更新ファイルが無い場合には、以下のメッセージを出力して処理が終了です。If objSearchResult.Updates.Count = 0 Then WScript.Echo "未適用の更新ファイルはありません." WScript.QuitEnd If

実行結果例を以下に示します。以下は、Windows XP で実行したものです。
※クリックすると拡大します

 

いかがでしたか?
なれないときついですよね。慣れましょう、是非! 

次回は、「その3 ダウンロード編」 です。

説明が全部出てくるのが待ちきれん!という方は、以下のサイトに掲載されているスクリプトを使用してください。なお、Vista の場合には、「管理者で実行」しないとアクセスが拒否されますので注意してください。

Searching, Downloading, and Installing Updates
https://msdn2.microsoft.com/en-us/library/aa387102.aspx