本页内容
知识就是力量
最后的思考
知识就是力量
好了,好了:站在走廊上往下看,看那些手中掌握实权的家伙们。我们有时很难理解,他们的权利到底和他们所掌握的知识有什么联系。虽然事实如此,但是尽量多地掌握你所能得到的知识和信息毕竟不是一件坏事,这对于计算机安全这个问题尤其正确。你对于你的计算机以及它的设置知道得越清楚,那么你也就越有信心。这就是为什么计算机安全专家们建议大家对自己的计算机进行阶段性安全检查的
原因。那么现在就剩一个问题:如何正确地进行这项阶段性安全检查?
事实上, Microsoft 已经发布了一款小巧实用的工具——Microsoft Baseline Security Analyzer——它能够帮助你完成这项安全检查。(我希望你已经下载了这个免费的小工具,如果还没有,请点击此处下载。)这款小工具的功能如其名称所示:它能够对一台计算机(如果你愿意,也可以是多台)进行分析,指出潜在的安全隐患,例如没有安装的安全补丁或者密码设置过于简单(甚至完全没有密码)的本地帐户。此软件个头虽小但却非常有用,无论是在家里还是办公室它都是必备软件。
当然,现在你也许在想:"好吧,既然 Security Analyzer 这么好用,我决定将它送给老妈作为圣诞礼物算了。但是这和脚本有什么关系呢?如果 Security Analyzer 能够提供我需要的一切,那我还要脚本干什么?Scripting Guys,我说的对吗?"
事实上,你说的很对:如果 Security Analyzer 能够做你所需要的一切,那么完全不必再使用脚本了。(或许你也并不是很需要那些救生圈,为什么不寄给 Scripting Guys,让我们来照顾它好了。)但是如果 Security Analyzer 并不能做你所需要的所有事情的时候怎么办?虽然 Security Analyzer 在收集信息方面做得很不错,但是毕竟它不能够对所收集到的信息做出任何反应。例如,它能够检测所有 5000 台工作站计算机的情况,并针对每台机子上的来宾帐户是否已经关闭做出详细报告(绝大多数机构都选择关闭来宾帐户以避免匿名或者没有授权的用户登录网络)。假设你的网络中有 2967 台计算机的来宾帐户没有关闭,那么 Security Analyzer 会将这一情况报告给你,但是最后还是需要你自己对每台机器进行处理,手动关闭这些机器上的来宾帐户。
后者就是脚本的用武之地。假如你想知道计算机上的来宾帐户是否已经关闭,你可以写一段脚本来完成上述过程,但是如果你只是想要检查一下这个帐户的状态的话,有什么意义?毕竟 Security Analyzer 就能够帮你检查帐户的状态,你完全没有必要写脚本。但是如果你想要做的不仅仅是检查一下帐户的状态而是想把打开的帐户全部关闭呢?单单靠 Security Analyzer 是不能完成上述两步的,但是你可以通过编写脚本来完成。
这也就是我们想在这里指出的。(如果你读过ADSI Scriptomatic Readme也许觉得很难相信,但是 Scripting Guys 实际上做的还是有点道理的)。脚本是一个很有用的工具,因为它可以帮助你得到与安全性相关的信息,但是它之所以成为必不可少的工具,其原因在于它可以对收集到的信息进行处理。这就是我们所要展示的:我们将向你展示 Security Analyzer 检索的信息,我们也想你展示如何通过编写能够检索同样信息的脚本。然后,在可能的时候,我们向你展示如何通过修改脚本来使它能够对检索的信息进行处理。
完全公布。好了,我们可能说的稍微有点夸张了:考虑到篇幅的原因,我们并不打算在此介绍 Security Analyzer 的所有功能。所以,
我们会跳过中间的某些步骤,比如校验 SQL 服务器的帐户密码。
希望你没有什么意见;Bentley 说他没问题。
顺便说一句,我们可能会在以后的专栏中更加深入地探讨与安全有关的话题。
例如,我们会解释(或者至少试着解释)安全标识符奇怪而神秘的世界以及如何通过脚本来控制它。我们也会向你展示脚本在管理补丁程序和安全补丁方面发挥的作用。但是现在我们暂且先把这些内容搁置一旁。现在,就让我们不受任何打扰,开始讲解 Security Analyzer 能做什么以及如何通过脚本来实现相同的功能。
注意: 再打扰一下。为了使我们的脚本片段尽可能短,你在这里看到的脚本都是针对单机(本地单机)的。Security Analyzer 的实力在于它可以针对多机使用。脚本是否也能够做到呢?你猜猜看;有关更多详细信息请参阅前一期脚本故事专栏。擦亮你的眼睛,看看 Runomatic 是如何贴到脚本中心的。
什么是 Runomatic?你不想我们来破坏你自己找到答案时的那种惊奇感,是吧?

任务1:检索计算机名
老实告诉你吧,通过脚本来检索计算机名的途径数不胜数。但是因为 WMI 将要成为检索信息的主流技术,所以我们所展示的是一段返回目标计算机名称的
WMI 脚本。
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")
Set colComputers = objWMIService.ExecQuery _
("Select * from Win32_ComputerSystem")
For Each objComputer in colComputers
Wscript.Echo objComputer.Name
Next
这看起来似乎有点可笑,尤其是这段脚本只是针对单机运行的时候。但是当它的目标计算机有 100 台的时候,它能够帮助我们将各台计算机区分开来。

任务2:检索 IP 地址
通过脚本实现 IP 地址检索同样非常简单:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer & "\root\cimv2")
Set IPConfigSet = objWMIService.ExecQuery _
("Select IPAddress from Win32_NetworkAdapterConfiguration " _
"Where IPEnabled=TRUE")
For Each IPConfig in IPConfigSet
If Not IsNull(IPConfig.IPAddress) Then
For Each strAddress in IPConfig.IPAddress
WScript.Echo strAddress
Next
End If
Next
在判定一台计算机的 IP 地址时,只要注意两点。第一,WMI 将包括 ××× 和 RAS 连接在内的所有东西都认为是计算机网络适配器设置的一部分,为此,我们需要使用 WHERE 语句Where IPEnabled = TRUE来将返回的信息限定为实际网络适配器的信息。
第二,IP 地址通常以数组的形式返回,因此我们需要用一个 For-Each 循环来获得真正的 IP 地址。如果我们直接回应 IP 地址属性值的话,
将会发生"类匹配"错误。

任务3:报告安全检查进行的日期和时间
实现这个功能也是非常的容易,但是鉴于我们复制绝大多数 Security Analyzer 的功能,下面是一行返回日期和时间的代码:
Wscript.Echo Now
你们有人不是觉得脚本是非常高深的吗!其实就这么简单。)(未完待序)