RegDBGetKeyValueEx (szKey, szName, nvType, svServicePackVersion, nvSize);
end;
如果一切顺利的话,我们现在就能访问 Gunn 的注册表并抽取服务包级别。
接下来,通过在 RegBConnectRegistry 命令中用表示其它两台机器的相应的名称替代“Gunn”,然后运行相同的过程;我们就可以抽取这两台机器的服务包级别。
我们注意到,三次重复输入相同的代码效率很低,因此可以使用循环机制来轮流查询每台机器的注册表。需要输入的全部信息是每台机器的名称。这可以通过创建一个文本文件来完成,该文件中,每一行包含一个机器的名称。因此,假设我们已经创建了一个名为 machineList.txt 的文本文件,其中输入了我们希望查询的三台机器的名称,并将它保存在 C 盘的根目录下。现在我们可以进一步修改脚本以把这些机器名读取到一个列表结构中,并轮流连接到每台机器的注册表。
清单 3. 从多台机器中抽取服务包级别
| begin listMachines = ListCreate(STRINGLIST); ListReadFromFile (listMachines, ";c:\\machineList.txt";); nResult = ListGetFirstString (listMachines, svMachineName); while (nResult != END_OF_LIST) RegDBConnectRegistry (svMachineName , HKEY_LOCAL_MACHINE, 0 ); svKey = ";SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";; svName = ";CurrentVersion";; nvType = REGDB_STRING; RegDBGetKeyValueEx (svKey, svName, nvType, svServicePackVersion, nvSize); nResult = ListGetNextString (listMachines, svMachineName); endwhile; end; |
以上代码将从 machineList.txt 文件中读入一个机器名,连接到它的注册表,进行查询,然后继续移到在文本文件中命名的下一台机器。使用这种方法的优点是通过简单编辑 machineList.txt 文件中的名称,我们能非常容易地在审计过程中添加和除去机器。
输出信息
到现在为止,您可能已经注意到当我们执行这些查询时,还没有产生任何输出。所以,现在我们来讨论确定表示输出结果的最好方法。我们团队决定把输出格式化为 XML 文件,因为这样使我们可以浏览检索到的信息,并且允许我们可能开发的任何其它应用程序利用这些数据。清单4 显示了用适当命名的标记生成的 XML 文件。
清单4. 从多台机器中抽取服务包级别并输出到 XML 文件 ;
| begin CreateFile (nvFileHandle, ";C:\";, ";Audit.xml";); WriteLine(nvFileHandle, ";<;?xml version=";1.0";?>;";); WriteLine(nvFileHandle, ";<;audits&;gt;";); listMachines = ListCreate(STRINGLIST); ListReadFromFile (listMachines, ";c:\machineList.txt";); nResult = ListGetFirstString (listMachines, svMachineName); while (nResult != END_OF_LIST) RegDBConnectRegistry (svMachineName , HKEY_LOCAL_MACHINE, 0 ); svKey = ";SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";; svName = ";CurrentVersion";; nvType = REGDB_STRING; RegDBGetKeyValueEx (svKey, svName, nvType, svServicePackVersion, nvSize); WriteLine(nvFileHandle, ";<;MachineName&;gt;";); WriteLine(nvFileHandle, ";<;ServicePack&;gt;"; + svCSDVersion+ ";<;/ServicePack&;gt;"; WriteLine(nvFileHandle, ";<;/MachineName&;gt;";); nResult = ListGetNextString (listMachines, svMachineName); endwhile; WriteLine(nvFileHandle, ";<;/audits&;gt;";); CloseFile(nvFileHandle) end; |