Skip to main content
評価してください: 

 

おまえとその犬の命はないからね...Windows Update も管理しましょう

2005 年 7 月

By Scripting Guys

「Tales from the Script」の 全コラムの一覧と詳細情報については、ここをクリックしてください。

*

トピック

手順 1おまえとその犬の命はないからね...Windows Update も管理しましょう
スクリプトとはいったい何かあなたは良いスクリプト インターフェイス? それとも悪いスクリプト インターフェイス?
それでも、スクリプトの内容はコードのように見える自動更新サービスがインストール済みかどうかを確認する
スクリプトの実行自動更新が有効かどうかを確認する
頭字語について自動更新を有効にする
スクリプト センターのナビゲート自動更新のスケジュールを確認する
独り立ちのときです自動更新のスケジュールを変更する
初心者のためにコンピュータを再起動する必要があるかどうかを確認する
独り立ちのときですコンピュータの更新を確認する
初心者のために更新を検索する
独り立ちのときです特定の更新がインストール済みかどうかを確認する
初心者のためにトト、もう Windows Update に不満を言えないみたい

*

おまえとその犬の命はないからね...Windows Update も管理しましょう

映画「オズの魔法使い」の中で、ドロシーはエメラルドの都に旅する途中、幾多の危機に見舞われます。ライオンや虎や熊に後をつけられたり、空飛ぶ猿にさらわれたり、西の悪い魔女に脅かされたり、といった具合にです (それでも、シアトル地区の通勤電車に毎朝揺られていくよりは、はるかに高速で楽な旅でしょう)。悪いことはさらに続き、これらの困難を切り抜けてからも、魔女の気球に置いてきぼりを食わされ、ドロシーはまだ故郷のカンザスに戻ることができません。

北の良い魔女グリンダが、「ドロシー、あなたにはいつでもカンザスに帰る力があるのよ。そう言わなかったかしら」と告げたとき、ようやくドロシーは家に帰ることができたのです。ええ、グリンダ。あなたは確かにそう言いました。助けてくれてありがとう。

注 : 恐ろしいのはグリンダが良い魔女だったということです。こんな友達がいたとしたら...。


後には、ドロシーは靴のかかとを 3 回打ち鳴らして「やっぱりお家が一番だわ」という文句を繰り返すことによって魔法の力でカンザスに帰りました。今でいえば、彼女は 35 才、2 人の子供を持つシングル マザー。アーカンソー州リトルリックで働く会計士でもあり、あのルビーのスリッパを eBay に出品したらいくらになるかと思案しています。

注 : こう考えてみましょう。たいていの人には手の届かない値がつくでしょう。映画で使われた有名な 5 足のルビーのスリッパがあり、2000 年にこれらのうちの 1 足がオークションで $600,000 にて落札されました。これは Scripting Guy の年収にほぼ匹敵します。


システム管理者も時にはドロシーのようなことを考えても許されるでしょう (冗談抜きで Scripting Guys は例のかかしのように脳みそが欲しいと願っています)。システム管理者は、Microsoft が適切な管理ツールを提供していないとしばしば嘆きますが、後になって、必要なツールがあったことを知るのです。北の良い魔女グリンダのように、そういうツールがあることを私たちが伝え忘れているだけなのです (なんということでしょう)。

Windows Update サービスを例にとってみましょう。Windows Update (および Windows Update と連携して重要な更新を自動配布する自動更新機能) により、更新プログラム、修正プログラム、サービス パック、およびその他のソフトウェアの更新を処理する問題に対処する機能は大きく前進しました。大部分においてシステム管理者はこの方法に満足しているようです。しかし、それでも、Microsoft は全社的に Windows Update を管理するのにより適したツールをなぜ提供してくれないのかという疑問は消えません。たとえば、システム管理者は、特定のユーザーが自動更新を無効にしたかどうかをどうやって確認すればよいでしょう。自動更新がすべてのコンピュータで予定されている日時をどうやって確認すればよいでしょう。特定の更新プログラムが特定のコンピュータにインストール済みであるかどうかを確認するにはどうすればよいでしょう。つまり、こういうことです。

「束の間のひとときを花々と語らい」
「阿呆のように問いかける」
「そして頭をかきむしりながら、ひたすら案を重ねる」
「ああ、ツールさえあったなら」

Peter Costantini は唯一のミュージカル系 Scripting Guy と目されています。

Windows Update を全社的に管理するためのツールは存在します。つまり、スクリプトです。コンピュータに自動更新をインストールするたびに、更新サービスを有効または無効にしたり、更新スケジュールを変更したり、インストール済みの更新の一覧を表示したり、新しい更新を自動インストールしたりする機能を持つ COM オブジェクト ライブラリが無償で提供されます。なかなか親切でしょう。

それでは、クライアント コンピュータ上で自動更新を管理するスクリプトを記述するにはどうしたらよいでしょう。われらが友、グリンダの言葉を借りれば、「いつでも最初から始めるのが一番。黄色いレンガの道に沿って進むだけでいいのです。」

それが済んだら、今月のコラムの残りを読んでください。

あなたは良いスクリプト インターフェイス? それとも悪いスクリプト インターフェイス?

話を進める前に、いくつかの注意事項があります。まず、Windows Update クライアント サービスのオブジェクト モデルは巨大だということです。この 1 回のコラムですべてを説明することは不可能です。概要を説明し、より有効な操作方法を紹介するいくつかのサンプル スクリプトを示すことが精一杯です。さらに詳細を知りたい場合は、MSDN の「 Windows Update Agent API」(英語) を参照してください。

また、リモート処理の話、つまり、Windows Update スクリプトをリモート コンピュータで使えるようにする処理は、控えめにいっても少し複雑になります。この記事の中には、リモート コンピュータで機能するスクリプトもあれば、機能しないスクリプトもあります。後者のスクリプトは (おそらくログオン時またはコンピュータの起動時のスクリプトとして) ローカルで実行する必要があります。これについては、できることはあまり多くはありませんが、リモート コンピュータで使用できるスクリプトか、使用できないスクリプトかを明示するように努めています。

すべてのスクリプトがリモート コンピュータで機能すればよいのですが、そうはいかないのです。では、誰かの家が落ちてこないうちに先に進みましょう。

注 : 安心してください。誰もあなたを家の下敷きにしたりはしません。

多分、しないと思います。


このコラムで示すサンプル スクリプトはすべてローカル コンピュータで機能するものであることも言い添えておきます。スクリプトをリモート マシンで実行するには (または、少なくともこれらのスクリプトをリモート マシンで実行可能にするには)、CreateObject の呼び出し時に 2 番目のパラメータにリモート コンピュータ名を追加する必要があります。たとえば、スクリプトをリモート コンピュータ atl-ws-01 で実行するには、コードの 1 行目を次のように記述します。

Set objSession = CreateObject("Microsoft.Update.Session", "atl-ws-01")

ところで、これは Windows Update とは無関係の、標準の VBScript です。VBScript では、常にリモート コンピュータ名を CreateObject の 2 番目のパラメータに指定できます。当然ながら、このパラメータが有効になるのは、対象 COM オブジェクトがリモート実行できる場合のみです。

唯一の例外は、最初のスクリプトです。このスクリプトは一般的な WMI スクリプトです。このスクリプトをリモート コンピュータで実行するには、コンピュータ名を変数 strComputer に割り当てるだけでよいのです。

strComputer = "atl-ws-01"

自動更新サービスがインストール済みかどうかを確認する

このスクリプトはリモート コンピュータで実行可能です。


自動更新が正しく構成されているかどうかを心配する前に、まずは自動更新がインストールされていることを確認した方がよいでしょう。自動更新はサービスとして実行されるため、インストール (および現在のサービスの状態) の確認を次のようなスクリプトで行うことができます。

strComputer = "."



Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")



Set colServices = objWMIService.ExecQuery _

    ("Select * from Win32_Service Where DisplayName = 'Automatic Updates'")



If colServices.Count = 0 Then

    Wscript.Echo "Automatic Updates is not installed."

Else

    For Each objService in colServices 

        Wscript.Echo "Automatic Updates: " & objService.State

    Next

End If

今月のコラムの重点は WMI ではなく、Windows Update にあるので、このスクリプトの内容については、表示名 (DisplayName) が自動更新 (Automatic Updates) であるすべてのサービスを取得するクエリであるということ以外、あまり詳しく説明しません。次に、このスクリプトでは、返されたコレクションの Count プロパティがチェックされます。この値はコレクションの項目数です。Count が 0 の場合は、サービスのインスタンスが 1 件も見つからなかったことを意味し、自動更新がインストールされていないと判断できます。Count が 0 以外の場合は、自動更新がインストール済みであると仮定できます。次に、インストールの有無と現在のサービスの状態を表示します。

自動更新が有効かどうかを確認する

このスクリプトはリモート コンピュータでは実行不可です


とりあえず、自動更新サービスを実行することは可能ですが、自動更新機能はまだ無効にしておきます。言うまでもありませんが、自動更新が有効かどうかを知っておくことが重要です。次に、自動更新が有効または無効であるかだけでなく、構成済みの "通知レベル" (更新が自動的にダウンロードされインストールされる、更新が自動的にダウンロードされるがインストールはされない、など) を通知するスクリプトを示します。

コードは次のようになります。

Set objAutoUpdate = CreateObject("Microsoft.Update.AutoUpdate")

Set objSettings = objAutoUpdate.Settings



Select Case objSettings.NotificationLevel

    Case 0

        Wscript.Echo "Notification level: Automatic Updates is not configured by the user " & _

            "or by a Group Policy administrator."

    Case 1

        Wscript.Echo "Notification level: Automatic Updates is disabled."

    Case 2

        Wscript.Echo "Notification level: Automatic Updates prompts users to approve updates " & _

            "before downloading or installing."

    Case 3

        Wscript.Echo "Notification level: Automatic Updates automatically downloads " & _

             "updates, but prompts users to approve them before installation."

    Case 4

        Wscript.Echo "Notification level: Automatic Updates automatically installs " & _

            "updates per the schedule specified by the user."

    Case Else

        Wscript.Echo "Notification level could not be determined."

End Select

このスクリプトでは、まず、Microsoft.Update.AutoUpdate オブジェクトのインスタンスを生成し、次に、Settings オブジェクトのインスタンスを生成します (Settings オブジェクトは Microsoft.Update.AutoUpdate の子オブジェクトです)。

注 : 悲しいことに、Settings オブジェクトはリモートで生成することはできません。ローカル コンピュータ上でのみ生成可能です。つまり、このスクリプトをリモート コンピュータで実行することはできないということです。スクリプトはローカルで実行する必要があります。耳にしたくない話だと思いますが、事実をお伝えしておきます。キンキンガチャガチャ音を立てるガラクタの寄せ集めという非難を受けてもやむを得ません。


Settings オブジェクトを生成したら、あとは NotificationLevel プロパティの値を表示するだけです。NotificationLevel で返される値は整数であるため (たとえば、1 は自動更新が無効であることを意味します)、Select Case ブロックを設定し、NotificationLevel に基づいて意味のわかる文字列値を表示します。自動更新がコンピュータでどのように構成されているかを理解するには、これだけで十分です。

自動更新を有効にする

このスクリプトはリモート コンピュータでは実行不可です。


映画「オズの魔法使い」をご存知なら、エメラルドの都を目指した苦難の旅はまだ道半ばであることがおわかりでしょう。目的地にようやくたどり着いたとき、ドロシーは、家に帰るためには悪い魔女のほうきを盗まなければならないと気付きました。Windows Update を扱うシステム管理者も似たような状況にあるかもしれません。ようやくコンピュータでの自動更新の構成がわかったところで、今度はこれらの更新機能を変更しなければならない場合があります。しかし、カンザスの農場から来た少女 (すなわちシステム管理者) は自動更新の設定をスクリプトで構成することができるのでしょうか。

もちろんですとも。

Const SCHEDULED_INSTALLATION = 4



Set objAutoUpdate = CreateObject("Microsoft.Update.AutoUpdate")

Set objSettings = objAutoUpdate.Settings



objSettings.NotificationLevel = SCHEDULED_INSTALLATION

objSettings.Save

ご覧のように、NotificationLevel は読み取り/書き込みプロパティです。自動更新の設定を変更するには、NotificationLevel に必要な値を設定し、Save メソッドを呼び出すだけです。このスクリプトでは、定数 SCHEDULED_INSTALLATION を定義し、値 4 を割り当てました。この前に示した、自動更新が有効であるかどうかを確認するスクリプトを振り返ってみると、4 を指定すると、ユーザーが指定したスケジュールに従って、自動的に更新のダウンロードおよびインストールが実行されることがわかります。Microsoft.Update.AutoUpdate オブジェクトと Settings 子オブジェクトを生成したら、次の 2 行のコードで NotificationLevel の値を変更し、変更を保存します。

objSettings.NotificationLevel = SCHEDULED_INSTALLATION

objSettings.Save

自動更新のスケジュールを確認する

このスクリプトはリモート コンピュータでは実行不可です。


自動更新が有効になっていることを確認することと同様に、自動更新をいつ実行するようにスケジューリングされているかを確認することも重要です。この情報は Settings オブジェクトから取得することもできます。この場合、ScheduledInstallationDay プロパティと ScheduledInstallationTime プロパティの値を確認するだけで済みます。

Set objAutoUpdate = CreateObject("Microsoft.Update.AutoUpdate")

Set objSettings = objAutoUpdate.Settings



Select Case objSettings.ScheduledInstallationDay

    Case 0

        Wscript.Echo "Scheduled installation day: Every day"

    Case 1

        Wscript.Echo "Scheduled installation day: Sunday"

    Case 2

        Wscript.Echo "Scheduled installation day: Monday"

    Case 3

        Wscript.Echo "Scheduled installation day: Tuesday"

    Case 4

        Wscript.Echo "Scheduled installation day: Wednesday"

    Case 5

        Wscript.Echo "Scheduled installation day: Thursday"

    Case 6

        Wscript.Echo "Scheduled installation day: Friday"

    Case 7

        Wscript.Echo "Scheduled installation day: Saturday"

    Case Else

        Wscript.Echo "The scheduled installation day is could not be determined."

End Select



If objSettings.ScheduledInstallationTime = 0 Then

    Wscript.Echo "Scheduled installation time: 12:00 AM"

ElseIf objSettings.ScheduledInstallationTime = 12 Then

    Wscript.Echo "Scheduled installation time: 12:00 PM"

Else

    If objSettings.ScheduledInstallationTime > 12 Then

        intScheduledTime = objSettings.ScheduledInstallationTime - 12

        strScheduledTime = intScheduledTime & ":00 PM"

    Else

        strScheduledTime = objSettings.ScheduledInstallationTime & ":00 AM"

    End If

    Wscript.Echo "Scheduled installation time: " & strScheduledTime

End If

このスクリプトは複雑に見えますが、それは単に ScheduledInstallationDay と ScheduledInstallationTime の値が整数で返されるからです。スクリプトの処理の大部分は、これらの整数値をわかりやすい内容に変換しているだけです。たとえば、スケジューリングされたインストール日が以下の値のいずれかで返されます。

  • 0 - 毎日
  • 1 - 日曜
  • 2 - 月曜
  • 3 - 火曜
  • 4 - 水曜
  • 5 - 木曜
  • 6 - 金曜
  • 7 - 土曜

このスクリプトでは、Select Case ブロックを設定して ScheduledInstallationDay の値をチェックし、5 や 2 といった数値ではなく、曜日を表示します。また、ScheduledInstallationTime は 0 ~ 23 の数字で返されます。0 は 12:00 AM を示し、1 は 1:00 AM を示します。これも、数値をわかりやすいテキストに変換するだけです。

自動更新のスケジュールを変更する

このスクリプトはリモート コンピュータでは実行不可です


大きな驚きを奪われてしまいました。そのとおり。自動更新をスケジューリングした日付と時刻を変更できます。ここでも、ScheduledInstallationDay プロパティと ScheduledInstallationTime プロパティに新しい値を設定し、Save メソッドを呼び出して変更を保存するだけです。

Const EVERY_THURSDAY = 5

Const FOUR_AM = 4



Set objAutoUpdate = CreateObject("Microsoft.Update.AutoUpdate")

Set objSettings = objAutoUpdate.Settings



objSettings.ScheduledInstallationDay = EVERY_THURSDAY

objSettings.ScheduledInstallationTime = FOUR_AM

objSettings.Save

まず、2 つの定数を定義します。EVERY_THURSDAY に値 5 を割り当てます。これは、新しい更新を毎週木曜日にチェックすることを示します。FOUR_AM に値 4 を割り当てます。このチェックを 4:00 AM に行うことを示します。次に、Microsoft.Update.AutoUpdate オブジェクト (およびその子オブジェクト Settings) を生成し、続く 3 行のコードでプロパティの値を変更して、変更を保存します。

objSettings.ScheduledInstallationDay = EVERY_THURSDAY

objSettings.ScheduledInstallationTime = FOUR_AM

objSettings.Save

コンピュータを再起動する必要があるかどうかを確認する

このスクリプトはリモート コンピュータでは実行不可です。


このスクリプトはおまけと思ってください。これは Scripting Guys からのささやかなプレゼントです。修正プログラムによっては、インストールを完了するにはコンピュータを再起動する必要があります。セキュリティに関する修正プログラムの場合は、再起動が行われるまでの間、ある種の攻撃に対してコンピュータが脆弱になる可能性があります。またはご存知のように、修正プログラムをインストールすると、すぐに再起動するか、後から再起動するかを確認するダイアログ ボックスが表示されます。意志の固いユーザーが [後で再起動する] ボタンをクリックし続けることがあるため (ダイアログ ボックスは定期的に再表示されます)、コンピュータの再起動が一向に行われない可能性があります。

このような場合の処理を行うスクリプトを次に示します。このスクリプトでは、更新のインストールを完了させるためにコンピュータを再起動する必要があるかどうかをユーザーに通知します。スクリプトは次のようになります。

Set objSysInfo = CreateObject("Microsoft.Update.SystemInfo")



If objSysInfo.RebootRequired Then

    Wscript.Echo "This computer needs to be rebooted."

Else

    Wscript.Echo "This computer does not need to be rebooted."

End If

何のトリックもなければ、カーテンの中に人が隠れているわけでもありません。Microsoft.Update.SystemInfo オブジェクトのインスタンスを生成して、RebootRequired プロパティの値をチェックするだけです。RebootRequired が True の場合は、修正プログラムのインストールを完了するためにコンピュータを再起動する必要があることを示します。RebootRequired が False の場合、再起動は不要です。

コンピュータの更新を確認する

このスクリプトはリモート コンピュータで実行可能です。


Windows Update の利点の 1 つは、更新履歴の追跡機能があることです。追跡対象には、コンピュータにインストールした更新の記録のほか、インストールしようとして失敗した更新やアンインストールした更新の記録も含まれます。何よりも、これらの履歴をスクリプトで取得できます。

Set objSession = CreateObject("Microsoft.Update.Session")

Set objSearcher = objSession.CreateUpdateSearcher

intHistoryCount = objSearcher.GetTotalHistoryCount



Set colHistory = objSearcher.QueryHistory(0, intHistoryCount)



For Each objEntry in colHistory

    Wscript.Echo "Title: " & objEntry.Title

    Wscript.Echo "Description: " & objEntry.Description

    Wscript.Echo "Update application date: " & objEntry.Date



    Select Case objEntry.Operation

        Case 1

            Wscript.Echo "Operation type: Installation"

        Case 2

            Wscript.Echo "Operation type: Uninstallation"

        Case Else

            Wscript.Echo "The operation type could not be determined."

    End Select



    Select Case objEntry.ResultCode

        Case 0

            Wscript.Echo "Operation result: The operation has not started."

        Case 1

            Wscript.Echo "Operation result: The operation is in progress."

        Case 2

            Wscript.Echo "Operation result: The operation completed successfully."

        Case 3

            Wscript.Echo "Operation result: The operation completed, 

            but one or more errors occurred " & _

            "during the operation and the results are potentially incomplete."

        Case 4

            Wscript.Echo "Operation result: The operation failed to complete."

        Case 5

            Wscript.Echo "Operation result: The operation was aborted."

        Case Else

            Wscript.Echo "The operation result could not be determined."

    End Select



    Set objIdentity = objEntry.UpdateIdentity

    Wscript.Echo "Update ID: " & objIdentity.UpdateID

    Wscript.Echo

Next

このスクリプトでは、まず、Microsoft.Update.Session オブジェクトのインスタンスを生成し、次に、CreateUpdateSearcher メソッドで Searcher オブジェクトのインスタンスを生成します。

注 : Searcher オブジェクトを直接生成してコードを 1 行節約することも可能です。しかし、Session オブジェクトを使用することにより、このスクリプトをリモート コンピュータで実行することができるようになります。何かの理由によって、Searcher オブジェクトをリモート コンピュータで使用する場合、リモート コンピュータ上で直接生成することはできません。不思議ですが。


オブジェクトを生成したら、次のコードを使って更新履歴の総件数を取得します。

intHistoryCount = objSearcher.GetTotalHistoryCount

この処理を行う必要があるのは、この後で QueryHistory メソッドを使って履歴コレクションのすべてのエントリを取得する操作を行うためです。このメソッドを呼び出すとき、インデックス番号を使って、取得する最初の更新と最後の更新を指定する必要があります。すべての更新を取得するには、開始番号の 0 と、履歴リストの最後の項目を示す終了番号を指定しなければなりません。このコードを実行すると、最後の項目が変数 intHistoryCount に格納されます。したがって、次の 1 行ですべての更新エントリを取得できます。

Set colHistory = objSearcher.QueryHistory(0, intHistoryCount)

あとは、For Each ループで履歴コレクションを 1 件ずつ処理し、プロパティ値の意味をよりわかりやすく表示するだけです。

注 : 履歴のエントリは逆順で格納されます。最後の更新イベントが項目 0、最後から 2 番目の更新イベントが項目 1、という具合になります。最後の更新イベントの情報を参照するには、次のコードを使います。

Set colHistory = objSearcher.QueryHistory(0, 1)

更新を検索する

このスクリプトはリモート コンピュータで実行可能です。


「Tales from the Script」のコラムもだいぶ長くなってきたので、このスクリプトはおまけだと思ってください。このスクリプトでは、Windows Update サイトに接続して、特定のコンピュータで使用可能なすべてのソフトウェアの更新の詳細情報を取得します (内部更新サーバーを使用している場合は、代わりにそのサーバーを検索します)。スクリプトの内容を逐一説明することはしませんが、ご自由に使ってみてください。

Set objSession = CreateObject("Microsoft.Update.Session")

Set objSearcher = objSession.CreateUpdateSearcher

Set objResults = objSearcher.Search("Type='Software'")

Set colUpdates = objResults.Updates



For i = 0 to colUpdates.Count - 1

    Wscript.Echo "Title: " & colUpdates.Item(i).Title

    Wscript.Echo "Autoselect on Web sites: " & colUpdates.Item(i).AutoSelectOnWebSites

    For Each strUpdate in colUpdates.Item(i).BundledUpdates

        Wscript.Echo "Bundled update: " & strUpdate

    Next

    Wscript.Echo "Can require source: " & colUpdates.Item(i).CanRequireSource

    Set objCategories = colUpdates.Item(i).Categories



    For z = 0 to objCategories.Count - 1

        Wscript.Echo "Category name: " & objCategories.Item(z).Name

        Wscript.Echo "Category ID: " & objCategories.Item(z).CategoryID

        For Each strChild in objCategories.Item(z).Children

            Wscript.Echo "Child category: " & strChild

        Next

        Wscript.Echo "Category description: " & objCategories.Item(z).Description

        Wscript.Echo "Category type: " & objCategories.Item(z).Type

    Next



    Wscript.Echo "Deadline: " & colUpdates.Item(i).Deadline

    Wscript.Echo "Delta compressed content available: " & _

        colUpdates.Item(i).DeltaCompressedContentAvailable

    Wscript.Echo "Delta compressed content preferred: " & _

        colUpdates.Item(i).DeltaCompressedContentPreferred

    Wscript.Echo "Description: " & colUpdates.Item(i).Description

    Wscript.Echo "EULA accepted: " & colUpdates.Item(i).EULAAccepted

    Wscript.Echo "EULA text: " & colUpdates.Item(i).EULAText

    Wscript.Echo "Handler ID: " & colUpdates.Item(i).HandlerID



    Set objIdentity = colUpdates.Item(i).Identity

    Wscript.Echo "Revision number: " & objIdentity.RevisionNumber

    Wscript.Echo "Update ID: " & objIdentity.UpdateID



    Set objInstallationBehavior = colUpdates.Item(i).InstallationBehavior

    Wscript.Echo "Can request user input: " & objInstallationBehavior.CanRequestUserInput



    Select Case objInstallationBehavior.Impact

        Case 0

            Wscript.Echo "Installation impact: Typical"

        Case 1

            Wscript.Echo "Installation impact: Negligible"

        Case 2

            Wscript.Echo "Installation impact: High"

        Case Else

            Wscript.Echo "The installation impact could not be determined."

    End Select



    Select Case objInstallationBehavior.RebootBehavior

        Case 0

            Wscript.Echo "Reboot behavior: No reboot required after installation."

        Case 1

            Wscript.Echo "Reboot behavior: A reboot is required after installation."

        Case 2

            Wscript.Echo "Reboot behavior: A reboot might be required after installation."

        Case Else

            Wscript.Echo "Reboot behavior: No information available 

            regarding the need for a reboot."

    End Select



    Wscript.Echo "Requires network connectivity: " & 

    objInstallationBehavior.RequiresNetworkConnectivity

    Wscript.Echo "Is beta: " & colUpdates.Item(i).IsBeta

    Wscript.Echo "Is hidden: " & colUpdates.Item(i).IsHidden

    Wscript.Echo "Is installed: " & colUpdates.Item(i).IsInstalled

    Wscript.Echo "Is mandatory: " & colUpdates.Item(i).IsMandatory

    Wscript.Echo "Is uninstallable: " & colUpdates.Item(i).IsUninstallable

    For Each strLanguage in colUpdates.Item(i).Languages

        Wscript.Echo "Supported language: " & strLanguage

    Next



    Wscript.Echo "Last deployment change time: " & colUpdates.Item(i).LastDeploymentChangeTime

    Wscript.Echo "Maximum download size: " & colUpdates.Item(i).MaxDownloadSize

    Wscript.Echo "Minimum download size: " & colUpdates.Item(i).MinDownloadSize

    Wscript.Echo "Microsoft Security Response Center severity: " & colUpdates.Item(i).MsrcSeverity

    Wscript.Echo "Support URL: " & colUpdates.Item(i).SupportURL



    Select Case colUpdates.Item(i).Type

        Case 1

            Wscript.Echo "Update type: Software"

        Case 2

            Wscript.Echo "Update type: Driver"

       Case Else

            Wscript.Echo "Update type: The update type could not be determined."

    End Select



    Wscript.Echo "Uninstallation notes: " & colUpdates.Item(i).UninstallationNotes



    x = 1

    For Each strStep in colUpdates.Item(i).UninstallationSteps

        Wscript.Echo x & " -- " & strStep

        x = x + 1

    Next



    For Each strArticle in colUpdates.Item(i).KBArticleIDs

        Wscript.Echo "KB article: " & strArticle

    Next



    Wscript.Echo



Next

前述したように、このスクリプトではソフトウェアの更新を参照しています。ドライバなどのハードウェアの更新を確認するには、3 行目を次のように変更するだけです。

Set objResults = objSearcher.Search("Type='Driver'")

特定の更新がインストール済みかどうかを確認する

このスクリプトはリモート コンピュータで実行可能です。


もう 1 つスクリプトを紹介して終わりにしましょう。自動更新の検索方式は範囲がやや限定されています。Type や IsInstalled などのプロパティでフィルタ処理できますが、Title などにより特定の更新を検索することはできません。そこで当然次のような疑問が起こります。特定の更新を検索できないのなら、特定の更新がインストール済みであるかどうかを確認するスクリプトをどうやって記述したらよいのでしょうか。

それは、強引な方法を使うとできるのです。つまり、特定の更新を検索するには、更新のコレクションを取得し、コレクションをループで処理して更新の内容と、その更新がインストール済みであるかどうかを確認すればよいのです。次に、Microsoft Windows Rights Management Services Client with Service Pack 1 の更新がコンピュータにインストール済みであるかどうかを確認するサンプル スクリプトを示します。

Set objSession = CreateObject("Microsoft.Update.Session")

Set objSearcher = objSession.CreateUpdateSearcher

Set objResults = objSearcher.Search("Type='Software'")

Set colUpdates = objResults.Updates



For i = 0 to colUpdates.Count - 1

    If colUpdates.Item(i).Title = _

        "Microsoft Windows Rights Management Services Client with Service Pack 1" Then

        If colUpdates.Item(i).IsInstalled <> 0 Then

            Wscript.Echo "This update is installed."

            Wscript.Quit

        Else

            Wscript.Echo "This update is not installed."

            Wscript.Quit

        End If

    End If

Next

まず、一連のオブジェクト参照を生成します。これらのオブジェクト参照に見覚えがあるとしたら、それは当然です。最初の 5 行は前のスクリプトとまったく同じです。すべての更新のコレクションを取得しています。これには相応の理由があります。このスクリプトでもすべての更新のコレクションを取得します。

2 つのスクリプトの違いは For Next ループに入ってから現れます。前のスクリプトでは、更新のプロパティ値を単純に表示するだけでした。このスクリプトでは、処理対象はすべての更新ではなく、特定の更新のみです。そのため、コレクションをループで処理するとき、次のコードを使用して、現在処理中の更新の Title が Microsoft Windows Rights Management Services Client with Service Pack 1 であるかどうかを確認します。

If colUpdates.Item(i).Title = _

    "Microsoft Windows Rights Management Services Client with Service Pack 1" Then

この名前で更新が見つかったら、どうするのでしょうか。次のコードで IsInstalled プロパティの値をチェックします。

If colUpdates.Item(i).IsInstalled <> 0 Then

IsInstalled が 0 であれば、更新はインストールされていません。ということは、IsInstalled が 0 でなければ、更新はインストール済みです。この場合、更新がインストール済みであることを伝えるメッセージを表示します。次に、Wscript.Quit メソッドでスクリプトを終了します (なぜかというと、更新が見つかり、インストール済みであることがわかったので、検索を続ける必要がないからです。そこで、スクリプトを終了します)。

IsInstalled が 0 の場合、更新はインストールされていません。したがって、その旨を伝えるメッセージを表示してスクリプトを終了します。正攻法の検索のようにエレガントではありませんが、最終結果は同じです。特定の更新がコンピュータにインストール済みであるかどうかはわかります。

トト、もう Windows Update に不満を言えないみたい

グリンダがドロシーにルビーのスリッパの話をして、それを使っていつでも家に帰ることができたと伝えた後、少し動揺したかかしは、「どうしてそれを教えてやらなかったんだ」と詰め寄ります。「教えても信じてもらえなかったでしょう」グリンダは答えました。「答えは自分で見つけるしかなかったのよ。」確かに、私たちが出て行って、「スクリプトで自動更新を管理することができます」と伝えれば、皆さんは信じてくれたことでしょう。それでも、皆さんが自力で習得したものはまったくの無駄ではなかったと願っています。まだ、Windows Update の自動化の表面をかじったにすぎません。詳細については、「 Windows Update Agent API」(英語) を参照してください。

えー、また次に何かのシステム管理作業を実行する簡単な方法が見つからないことを嘆くときは、臆病なライオンの言葉を思い出してください。「私はスクリプトを信じます。私はスクリプトを信じます。本当に、本当に心から私はスクリプトを信じます...」

今月のコラムに関する質問やコメントがあれば (願わくば空飛ぶ猿を使って)、 scripter@microsoft.com (英語のみ) までお寄せください。