| 网站首页 | 新闻中心 | 系统安全 | 网络安全 | 安全技术 | 下载中心 | 
课件制作网.
收藏本站
设为首页
安全365
如何在计算机上检索系统 DSN 的列表?
如何在计算机上检索系统 DSN 的列表?
作者:佚名 文章来源:不详 点击数: 更新时间:2007-1-24 11:02:30

问:
您好,脚本专家! 如何在计算机上检索系统 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】
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
     
     
     
    CSO们如何应对新技术的安
    普通企业如何应对黑客攻
    企业该如何防范由VoIP引
    浅谈IT如何实现企业的应
    黑客与正规企业是如何串
    如何无限制申请Gmail 2.
    企业如何避免人为因素的
    社会工程学:如何利用黑客
    如何在一个文件被添加到
    如何将“珊瑚虫”好友请

    Copyright © 2006-2008 www.anquan365.com 安全365
    建议使用1024*768分辨率及第三方浏览器对本站进行浏览