问: 您好,脚本专家! 如何在计算机上检索系统 DSN 的列表?
-- RT
答: 您好,RT。 您知道,有一个古老的好莱坞迷信说著名的电影明星总是三人先后死去: 如果今天一位明星死去,则根据传说另外两位明星也注定会在下个星期死去。 我们不知道这是否属实,但是我们知道一种类似怪诞的脚本推论,并且是真的: 有关 ODBC 数据源的问题总是成对出现。
想嘲笑就笑吧,但事实胜于雄辩: 两个星期前,我们回答了一个问题,是关于检索安装在计算机上的 ODBC 驱动程序组的。 现在,我们突然收到一个有关检索系统 DSN 的问题!
听着,不要觉得不舒服: 这非常怪异。
注意: 是的,我们知道: 您认为有关系统 DSN 的这件事仅仅是另一个都市传奇,与某人吃跳跳糖,喝汽水,然后导致胃爆炸的恐怖故事类似。 再好好想想吧,哈?
如果您觉得我们不知所云(这种情况好像越来越常出现在此专栏中),那么好吧;系统 DSN 仅仅是一种连接数据库及其它数据源的快捷方法。 您可以查看计算机上的系统 DSN 列表,方法:打开 ODBC Data Source Administrator(ODBC 数据源管理员)对话框,并查看 System DSN(系统 DSN)选项卡:
如果您是在本地计算机上工作,则没有问题。 但是,如果您想在远程计算机上检索系统 DSN 列表,或者要在一整组计算机上存储系统 DSN,怎么办? 您要如何执行诸如此类的操作呢?
嗯,当然是使用脚本:
Const HKEY_LOCAL_MACHINE = &H80000002 strComputer = "." Set objRegistry = GetObject("winmgmts://" & strComputer & "/root/default:StdRegProv") strKeyPath = "SOFTWARE/ODBC/ODBC.INI/ODBC DATA SOURCES"
objRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes For i = 0 to Ubound(arrValueNames) strValueName = arrValueNames(i) objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue Wscript.Echo strValueName & " -- " & strValue Next
由于某种原因,没有 WMI 类或其它 COM 对象用于检索系统 DSN。但是没关系: 因为该信息存储在注册表中,所以我们仍然可以编写脚本以提取并返回 DSN。 正如您所期望的那样,这正是上述脚本的作用: 它会打开注册表,压缩到 HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBC.INI/ODBC DATA SOURCES,然后返回在此处找到的所有注册表项的名称和值。 每个项均由名称(表示 DSN 名称)和值(表示 DSN 驱动程序)组成。 我们将返回并回显名称和值,从而复制在该对话框中找到的信息。
我们的脚本将首先定义一个名为 HKEY_LOCAL_MACHINE 的常量,并将其值设定为 &H80000002;我们将用此常量指明要使用的注册表配置单元。 然后,我们将绑定到 WMI 服务,同时连接到 StdRegProv 类。 (当我们总是急于添加时,可以在 root/default 命名空间中而不是 root/cimv2 中找到此类。 事实上,这曾是我们第一个专栏的主题。)
随后,我们会将 HKEY_LOCAL_MACHINE 内的注册表路径分配给名为 strKeyPath 的变量。 完成后,我们便可以使用以下代码行调用 EnumValues 方法并返回存储在 HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBC.INI/ODBC DATA SOURCES 中的所有注册表值列表:
objRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes
正如您所看到的那样,我们将四个参数传递给 EnumValues。 前两个参数 – HKEY_LOCAL_MACHINE 和 strKeyPath – 是表示注册表配置单元和注册表路径的“输入参数”。 后两个参数 – arrValueNames 和 arrValueTypes – 是“输出参数”,也就是说它们代表 EnumValues 方法返回给我们的信息。 在 EnumValues 运行后,将使用在 HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBC.INI/ODBC DATA SOURCES 中找到的所有注册表值的名称填充 arrValueNames;同时,将使用所有这些值的注册表数据类型填充 arrValueTypes。
注意: 在此特定脚本中,我们实际上不会使用数据类型;这是因为所有值都将是 REG_SZ 类型的字符串值。
在这个时间点上,我们具有每个注册表项的名称;如果我们所要执行的全部是回显名称操作,则实际上已完成。 但是,我们还需要回显每个 DSN 的值(即,驱动程序名称)。 为此,我们需要连接到每个单独的注册表项,并返回值。 要执行该操作,我们需要设置遍历注册表项数组的 For Next 循环。 对于该数组中的每一个项,我们会将 DSN 名称分配给名为 strValueName 的变量。 然后,调用 GetStringValue 方法来返回分配给该注册表项的值:
objRegistry.GetStringValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName, strValue
在此脚本中,strValue 是包含注册表值的输出参数。 现在,我们在一个变量 (strValueName) 中有 DSN 名称,在另一个变量 (strValue) 中有 DSN 驱动程序。 剩下要做的事情就是在屏幕上显示该信息:
Wscript.Echo strValueName & " -- " & strValue
在运行脚本时,我们会获得类似于下列内容的信息(这取决于计算机上的 DSN):
Northwind -- SQL Server Scripting Content -- SQL Server Events -- Microsoft Access Driver (*.mdb)
非常酷,哈? 但是请记住,吃跳跳糖时切勿运行此脚本。 冒险毫无意义,对吧?
附言: 不用问, 您现在想知道是否可以使用脚本创建和删除系统 DSN。 没错吧,这一次我们比您先想到了。 【转自世纪安全网 http://www.21safe.com】
|