本页内容
我要得到你,我的美人…并且我们也要管理 Windows Update 啦! | |
您的脚本编写界面是好还是坏? | |
确定是否已安装了自动更新服务 | |
确定是否启用了自动更新 | |
启用自动更新 | |
确定自动更新计划 | |
修改自动更新计划 | |
确定是否需要重新启动计算机 | |
检查计算机上的更新 | |
搜索更新 | |
确定是否安装了某个具体更新 | |
Toto,我有一个感觉,我们不能再抱怨 Windows Update 了 |
我要得到你,我的美人…并且我们也要管理 Windows Update 啦!
在电影 The Wizard of Oz(绿野仙踪)中,Dorothy(多萝西)在前往翡翠城的路上历经重重危险:她被狮子、老虎、大熊跟踪(哦,我的天!);被飞猴掠走;并受到西方邪恶女巫的威胁。(总之,虽然如此,但是她的旅行要比西雅图地区的通勤者每天早上面对的旅行更为快速、也容易得多。)更糟的是,在历经所有的艰辛之后,魔法师的气球没有带上她就飞走了,这使她甚至无法回到堪萨斯。
直到这时善良的北方女巫 Glinda(葛琳达)才对她说:“你知道吗,Dorothy(多萝西),你总是能够回到堪萨斯的。我忘记提醒你这一点了吗?”是的,Glinda(葛琳达),你确实忘了。感谢您全力相助。
注意。可怕的事情就是象 Glinda(葛琳达)这样的善良女巫。遇到这样的朋友…。 |
当然,Dorothy(多萝西)最后将她的鞋跟互碰了三下,并重复说着“没有什么地方比得上家”,然后她便被神奇地送回到堪萨斯。今天,她已经是 35 岁的单身妈妈,在阿肯色州的 Little Rick 有两份会计工作,而且正想知道出多少钱能从 EBay(易趣网)上买到那双红魔鞋呢。
注意。让我们这样来解释一下:我们大多数人都买不起。有五双已知的红魔鞋曾经在电影中使用过,在 2000 年的时候,其中的一双拍卖了 $600,000。这几乎是一个脚本专家一年的薪水! |
如果系统管理员有时就像 Dorothy(多萝西),还可以被原谅。(脚本专家要像那个需要心智的稻草人,这可不是闹着玩的。)系统管理员常常惋惜 Microsoft 没能给他们提供正确的管理工具,但直到最近才发现我们确实提供了那些工具;就像那个善良的北方女巫 Glinda(葛琳达),我们只是忘了告诉他们。(“哦,我的天!”确实如此。)
拿 Windows Update 服务来举例。Windows Update(和“自动更新”,该功能协同 Windows Update 一起来实现自动关键的更新)在解决处理补丁、快速修复、Service Pack 以及其他软件的更新等问题方面取得了较大成功。大部分系统管理员似乎很满意这种方法。他们仍然情不自禁地想知道为什么 Microsoft 未提供更好的工具用于跨企业管理 Windows Update 呢?例如,系统管理员如何能知道某个具体的用户是否已禁用了“自动更新”呢?您如何能知道在您的计算机上计划了“自动更新”任务呢?如何能验证在某台具体的计算机已经安装了某个具体的补丁呢?换句话说:
我会享受美好时光,同花儿呢喃
像傻瓜一样请教问题。
抓抓头皮,灵感便在脑中酝酿
只要我有一个工具。
人们认为 Peter Costantini 是唯一有音乐天赋的脚本专家!
正如所证实的那样,您实际上确实拥有一些工具可用于跨企业管理 Windows Update:脚本。只要在计算机上安装“自动更新”,您就可以免费获得 COM 对象库,它可以启用和禁用更新服务,修改更新计划,查看已安装的更新程序列表,甚至是为您安装新的更新。很神奇吧?
那么如何编写在客户计算机上能管理“自动更新”服务的脚本呢?好,这要引用我们的老朋友 Glinda(葛琳达)的话:“最好就是一开始就走 - 然后您只要顺着黄砖路走。”
在这样做之后,请阅读本月专栏的其他内容。
您的脚本编写界面是好还是坏?
开始之前,我们要提几条注意事项。首先,Windows Update 客户服务的对象模型非常大,不可能在这一个专栏中都介绍到。我们最多能做的就是概述一下并给出几个脚本示例以包括一些更有用的任务;如果您想作更深入地了解,那么请浏览 MSDN 上的 Windows Update Agent API(英文)。
另外,关于远程故事(即:对远程计算机使用 Windows Update 脚本的功能)至少有点不好理解。正如您通览本文所见,有些脚本对远程计算机起作用,而有些脚本则不起作用;后者脚本集必须在本地运行(也许作为登录脚本或计算机启动脚本)。对此我们能做的有限,但是随着我们讲述,我们会试着澄清哪些脚本对远程计算机起作用,哪些脚本则不能起作用。
当然,我们也希望所有的脚本都能对远程计算机起作用;不幸的是,它们不能。赶快走吧,免得有人扔幢房子压倒你。
注意。不要紧张;不可能有人会给你扔房子。 喔,也许有呢。 |
我们要补充的是本专栏列出的所有示例脚本都对本地计算机起作用。要对远程计算机运行脚本(或至少那些能作用于远程计算机的脚本),您需要将远程计算机名称作为第二个参数添加到 CreateObject 调用中。例如,要对远程计算机 atl-ws-01 运行脚本,您的第一行代码应如下所示:
Set objSession = CreateObject("Microsoft.Update.Session", "atl-ws-01")
顺便说一句,这与 Windows Update 无关;它是标准的 VBScript。VBScript 总是允许您指定远程计算机名称作为 CreateObject 的第二个参数;当然,仅当能够远程运行所讨论的 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
由于本月专栏的焦点是 Windows Update 而不是 WMI,因此,除了该脚本实际上会为所有服务查询 DisplayName 为 Automatic Updates 的计算机之外,我们将不在此作更多的介绍。该本脚然后会检查所返回集合的 Count 属性,它将表示该集合中项数。如果 Count 等于 0,表示未找到服务的实例,我们就可以认为没有安装“自动更新”。如果 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 回显一个更有意义的字符串值。仅此而已,这就是为找到在计算机上是如何配置了“自动更新”,我们必须执行的全部操作。
启用自动更新
无法对远程计算机运行此脚本。 |
如果熟悉电影 The Wizard of Oz(绿野仙踪),那么您一定知道到达翡翠城只是成功了一半:到达那里之后,Dorothy(多萝西)发现,要赚得回家的通路,必须偷到邪恶女巫的扫把。作为系统管理员,您可能会发现在处理 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 子对象后,我们使用这两行代码更改 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 ¨C 每天 |
• | 1 ¨C 星期日 |
• | 2 ¨C 星期一 |
• | 3 ¨C 星期二 |
• | 4 ¨C 星期三 |
• | 5 ¨C 星期四 |
• | 6 ¨C 星期五 |
• | 7 ¨C 星期六 |
在脚本中,我们只需设置 Select Case 块来检查 ScheduledInstallationDay 的值,然后回显星期几(而不是 5 或 2)。同样,以 0 到 23 之间的一个数字返回 ScheduledInstallationTime,其中 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
首先,我们在此脚本的开头定义两个常量。EVERY_THURSDAY,值为 5,表示我们要每星期四检查新更新;FOUR_AM,值为 4,表示我们要在 4:00 AM 进行该项检查。我们创建 Microsoft.Update.AutoUpdate 对象(和它的子对象 Settings)的一个实例,然后使用这三行代码修改属性值并保存更改:
objSettings.ScheduledInstallationDay = EVERY_THURSDAY objSettings.ScheduledInstallationTime = FOUR_AM objSettings.Save
确定是否需要重新启动计算机
无法对远程计算机运行此脚本。 |
请把它视为一个额外赠送的脚本,一个来自脚本专家的小礼物。如您知道的那样,一些补丁在安装完成之前,要求重新启动计算机;如果它是安全补丁,则仅当重新启动后,计算机才可能不容易受到某些攻击。或许您还可能知道,安装补丁时,将显示一个对话框询问用户是否立即重新启动或是稍后再重新启动。执着而坚定的用户可以连续单击“稍后”按钮(此对话框将定期重复出现),一直不重新启动计算机。
这就是本脚本的作用:它能够告诉您要完成安装更新是否需要重新启动计算机。该脚本如下所示:
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 为您做的一件很酷的事是跟踪您的更新历史:它不仅包括您在计算机上已安装的更新的记录,而且包括想安装却无法安装的更新以及未安装的更新。最大的优势在于,您可以使用脚本来检索该历史:
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 对象,从而少创建一行代码。不过,通过使用 Session 对象,我们可以对远程计算机运行此脚本。由于某种原因,虽然我们可以对远程计算机使用该 Searcher 对象,但无法在远程计算机上直接创建该对象。去想一想。 |
创建对象后,我们使用该代码获得更新历史中的条目总数:
intHistoryCount = objSearcher.GetTotalHistoryCount
我们要这样做是因为稍候我们将使用 QueryHistory 方法来检索历史集中的所有条目。我们调用此方法时,必须使用索引号指定要检索的第一个更新和最后一个更新。如果我们想检索所有的更新,需要从 0 开始,并使用能表示历史列表中最后一项的数字结束。通过使用上面那行代码,我们可以将最后一项存储在 intHistoryCount 变量中,这就是说我们只要这样就能检索到所有的更新条目:
Set colHistory = objSearcher.QueryHistory(0, intHistoryCount)
之后,我们只需编写一个 For Each 循环来遍历该历史集合,以此方法就可以回显某些更有用的属性值。
还需要注意。历史条目按倒序存储:最后发生的更新事件为项 0,倒数第二更新的事件为项 1,依此类推。如果只想查看关于最后的更新事件,请使用以下这行代码: Set colHistory = objSearcher.QueryHistory(0, 1) |
搜索更新
可对远程计算机运行此脚本。 |
我们已经进行了很长时间的脚本故事专栏,因此请将此脚本视为一项奖励:它可以访问 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
正如我们注意到的,以上脚本将查看软件更新。如果您需要检测驱动程序和其他硬件更新,那么只需按如下所示更改第三行:
Set objResults = objSearcher.Search("Type='Driver'")
确定是否安装了某个具体更新
可对远程计算机运行此脚本。 |
好啦,只再讲一个脚本,我们就结束。“自动更新”的搜索机制在范围方面有点受限制:尽管可通过属性(如 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
首先,我们创建一系列对象引用。如果这些对象引用看起来很熟悉,它们确实应该如此:前五行代码与我们先前的脚本完全相同,即返回所有更新的集合的那个脚本。这样做有一个充分的理由:本脚本也要返回所有更新的集合。
仅当我们进入 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,那么尚未安装此更新。从而,我们将回显指明该大意的消息,然后终止此脚本。它并不像正式的搜索那么好,但是最终结果是相同的:我们可以知道在该计算机上是否安装了此具体的更新。
Toto,我有一个感觉,我们不能再抱怨 Windows Update 了
Glinda(葛琳达)告诉 Dorothy(多萝西)关于红魔鞋的事情以及她可以随时使用红魔鞋回家的方法之后,稻草人感到一丝难过。“以前为什么不告诉她呢?”他问道。“因为她不会相信我”,Glinda(葛琳达)回答说。“她得自己认识到”。说实话,要不是我们告诉您可以使用脚本管理“自动更新”,您可能还不相信我们;不过,我们仍然希望您自己了解它才必有所得。还要注意的是,我们只是简要介绍了您能够对自动 Windows Update 进行哪些处理;有关详细信息,请参阅 Windows Update Agent API(英文)。
哦,下次您感叹缺少执行一些系统管理任务的简单方法时,就请记得那只胆小狮子的话:“我确实相信脚本。我确实相信脚本。我确实,我确实,我确实,我确实,我确实相信脚本…”。