1

我正在创建一个验证实用程序,用于检查应用程序的各个部分以确保它们配置正确。我需要检查的一件事是 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();
4

3 回答 3

0

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

于 2011-06-24T19:42:53.230 回答
0

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

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

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

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

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

于 2011-06-24T19:48:11.620 回答
0

So the DSN conn values are stored in the registry as plaintext, which is what I needed.

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();
于 2011-07-06T20:13:06.363 回答