評価してください: |
2005 年 7 月 By Scripting Guys トピック おまえとその犬の命はないからね...Windows Update も管理しましょう映画「オズの魔法使い」の中で、ドロシーはエメラルドの都に旅する途中、幾多の危機に見舞われます。ライオンや虎や熊に後をつけられたり、空飛ぶ猿にさらわれたり、西の悪い魔女に脅かされたり、といった具合にです (それでも、シアトル地区の通勤電車に毎朝揺られていくよりは、はるかに高速で楽な旅でしょう)。悪いことはさらに続き、これらの困難を切り抜けてからも、魔女の気球に置いてきぼりを食わされ、ドロシーはまだ故郷のカンザスに戻ることができません。 北の良い魔女グリンダが、「ドロシー、あなたにはいつでもカンザスに帰る力があるのよ。そう言わなかったかしら」と告げたとき、ようやくドロシーは家に帰ることができたのです。ええ、グリンダ。あなたは確かにそう言いました。助けてくれてありがとう。 注 : 恐ろしいのはグリンダが良い魔女だったということです。こんな友達がいたとしたら...。
注 : こう考えてみましょう。たいていの人には手の届かない値がつくでしょう。映画で使われた有名な 5 足のルビーのスリッパがあり、2000 年にこれらのうちの 1 足がオークションで $600,000 にて落札されました。これは Scripting Guy の年収にほぼ匹敵します。
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 スクリプトをリモート コンピュータで使えるようにする処理は、控えめにいっても少し複雑になります。この記事の中には、リモート コンピュータで機能するスクリプトもあれば、機能しないスクリプトもあります。後者のスクリプトは (おそらくログオン時またはコンピュータの起動時のスクリプトとして) ローカルで実行する必要があります。これについては、できることはあまり多くはありませんが、リモート コンピュータで使用できるスクリプトか、使用できないスクリプトかを明示するように努めています。 すべてのスクリプトがリモート コンピュータで機能すればよいのですが、そうはいかないのです。では、誰かの家が落ちてこないうちに先に進みましょう。
| 新着情報を入手する |
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> (英語のみ) までお寄せください。
0 件のコメント:
コメントを投稿