如何验证远程DSN条目

本文关键字:DSN 条目 验证 何验证 | 更新日期: 2023-09-27 18:00:13

我正在创建一个验证实用程序,用于检查应用程序的各个部分,以确保它们配置正确。我需要检查的一件事是Web.config文件中的DSN条目是否是一个功能性DSN,并且该DSN是否指向正确的SQL服务器和数据库。

目前,您可以在本地或远程两种模式中的一种模式下运行该实用程序。当我尝试在本地计算机上验证远程系统DSN时,就会出现问题。我知道为什么它不起作用,我的本地计算机上没有相同的DSN。因此,我需要弄清楚的是,如何从我有管理权限的远程机器中检索DSN连接信息,或者让远程机器为我验证它。

有什么建议吗?谢谢

编辑
很明显,DSN信息也存储在注册表中!

oRegConn = new ConnectionOptions();
oRegConn.Username = username;
oRegConn.Password = password;
scope = new ManagementScope(@"//" + servername + @"/root/default", oRegConn);
registry = new ManagementClass(scope, new ManagementPath("StdRegProv"), null);
inParams = registry.GetMethodParameters("GetStringValue");
inParams["sSubKeyName"] = "SOFTWARE''ODBC''ODBC.INI''ODBC Data Sources''" + 
    dsnName;
inParams["sValueName"] = "Server";
outParams = registry.InvokeMethod("GetStringValue", inParams, null);
server = outParams["sValue"].ToString();

如何验证远程DSN条目

如果你在另一个系统(你的)上运行它,我会说这不是一个真正有效的检查。防火墙规则可能会有所不同,驱动程序版本可能会关闭,等等。我想说的第一件事是,如果这是一个web应用程序,请构建一个可以运行这些检查的页面,比如状态页面。如果这是一个你无法做到的应用程序,你可以使用WMI运行远程进程并收集结果。除此之外,你的最后一个选择可能是做一个自托管WCF服务或一个连接到查询信息的windows服务。这并不罕见,我已经用WMI做过很多次了。

在这种情况下,您可能需要调查PSExec(通过Sysinternals)。您可以在远程计算机上以"本地"模式运行您的实用程序,只要您对该计算机具有管理访问权限即可。

您的"DSN验证"部分必须是一个单独的可执行文件/命令,它可以由您的主要实用程序使用类似以下语法执行:

psexec ''REMOTE-Machine <DSN Verification Utility>.exe

可以通过重定向stdout/stderr在C#中捕获输出。

如果我错了,请原谅我,但打开到远程数据库服务器的连接是否会让你知道你的连接字符串/DSN是否正常?

因此DSN conn值以明文形式存储在注册表中,这正是我所需要的。

oRegConn = new ConnectionOptions();
oRegConn.Username = username;
oRegConn.Password = password;
scope = new ManagementScope(@"//" + servername + @"/root/default", oRegConn);
registry = new ManagementClass(scope, new ManagementPath("StdRegProv"), null);
inParams = registry.GetMethodParameters("GetStringValue");
inParams["sSubKeyName"] = "SOFTWARE''ODBC''ODBC.INI''ODBC Data Sources''" + 
    dsnName;
inParams["sValueName"] = "Server";
outParams = registry.InvokeMethod("GetStringValue", inParams, null);
server = outParams["sValue"].ToString();