2012年4月13日金曜日

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


評価してください: 

2005 年 7 月

By Scripting Guys

トピック

おまえとその犬の命はないからね...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」(英語) を参照してください。

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

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



These are our most popular posts:

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

クライアント コンピュータ上で自動更新を管理するスクリプトを記述する方法を解説し ます。 ... このメソッドを呼び出すとき、インデックス番号を使って、取得する最初の更新と 最後の更新を指定する必要があります。すべての更新を取得するには、開始番号の 0 と 、 ... read more

Talking Tails - おしゃべりなしっぽ:日本出入国時の犬の検疫制度と ...

北米在住の飼主さんは必ず獣医にワクチンが不活性であることを確認する必要が あります。EU諸国および ... 血清採取は2回目の狂犬病予防接種と同日でも構いません が、より確実な結果を得るためには2回目接種から21日以上経過してからが良いで しょう。大きな動物病院で .... 分程です。 新しいオフィスは空港に隣接したビルの1階に あります。 read more

犬でもわかるExcelVBA講座(ヘルプとイミディエイト)

犬でもわかるExcelVBA講座 第5回は ヘルプとイミディエイトの使い方その1を紹介! ... ツール(T)→マクロ(M)→新しいマクロの記録(R) で 『マクロの記録ダイアログ』が ... 全部 選択する必要は無いんですがこの方が確実なので一応・・) すると私の嫌いな ... 値の 取得および設定が可能です。 とか書いてありますがこれは数式用のプロパティだったん です。 しかもR1C1って .... かなり便利でこれから複雑なものを作るときにや 変数の値を ... read more

India Visa Application Center, Japan

私が要求したサービスに時間がかかりすぎるときに大使館が私の申請を処理中に私の パスポートを返却してもらえますか。 ... インドへ行くときに、私がAIDSなどにかかってい ないという健康証明書を持参する必要がありますか。 .... 最初に学生/研究者ビザを 取得したコースを修了した後で、インドでのビザを延長して他のコースに参加できますか 。 read more

0 件のコメント:

コメントを投稿