C# 以编程方式查找sql server的所有实例
我知道有相当多的主题类似于这一个,但没有一个提供了正确的答案,我正在寻找 我正在努力收集我们网络上的所有SQL Server实例。它应该能够检测正在运行的SQl Server版本。我们运行的不同版本在“C# 以编程方式查找sql server的所有实例,c#,sql-server,wmi,C#,Sql Server,Wmi,我知道有相当多的主题类似于这一个,但没有一个提供了正确的答案,我正在寻找 我正在努力收集我们网络上的所有SQL Server实例。它应该能够检测正在运行的SQl Server版本。我们运行的不同版本在“SQLServer2000”和“SQLServer2008R2”之间有所不同 给你们一点背景信息,目前我正在开发我们的本地网络,但稍后它将在我们的服务器上运行以收集信息 收集到的一些信息包括: 应用程序池 iis安装 服务器上的所有数据库 还有更多像这样的东西 通过WMI查询,这一切都可以正常
SQLServer2000
”和“SQLServer2008R2
”之间有所不同
给你们一点背景信息,目前我正在开发我们的本地网络,但稍后它将在我们的服务器上运行以收集信息
收集到的一些信息包括:
- 应用程序池
- iis安装
- 服务器上的所有数据库
- 还有更多像这样的东西
root\\Microsoft\\SqlServer\\ComputerManagement10
和ServerSettings
类。但这只提供SQLSERVER和SQLEXPRESS,没有版本号。让它变得毫无用处李>
root\\CIMV2 Win32\u产品
,包括where like sql子句。但这返回的数据远不止我要寻找的数据。此外,查询本身非常慢SqlDataSourceEnumerator
。尽管这仅在特定服务正在运行且某些端口已打开时才起作用。由于可能的安全问题和可能的错误数据,我们最好不要这样做总而言之:我需要检索版本在2000和2008 R2之间的域上安装的所有
SQL Server
实例好的,我解决了这个问题。我做了几件事:
- 首先,我扫描域中的机器
- 检查SQLBrowser服务是否正在运行,如果没有,请启动它!这是由位于
system.ServiceProcess
- 启动所有SQLBrowser后,我使用
枚举所有实例SqlDataSourceEnumerator
注意:您需要网络管理员权限才能在远程计算机上启动它。
public void StartSqlBrowserService(List<String> activeMachines)
{
ServiceController myService = new ServiceController();
myService.ServiceName = "SQLBrowser";
foreach (var machine in activeMachines)
{
try
{
myService.MachineName = machine;
string svcStatus = myService.Status.ToString();
switch (svcStatus)
{
case "ContinuePending":
Console.WriteLine("Service is attempting to continue.");
break;
case "Paused":
Console.WriteLine("Service is paused.");
Console.WriteLine("Attempting to continue the service.");
myService.Continue();
break;
case "PausePending":
Console.WriteLine("Service is pausing.");
Thread.Sleep(5000);
try
{
Console.WriteLine("Attempting to continue the service.");
myService.Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
break;
case "Running":
Console.WriteLine("Service is already running.");
break;
case "StartPending":
Console.WriteLine("Service is starting.");
break;
case "Stopped":
Console.WriteLine("Service is stopped.");
Console.WriteLine("Attempting to start service.");
myService.Start();
break;
case "StopPending":
Console.WriteLine("Service is stopping.");
Thread.Sleep(5000);
try
{
Console.WriteLine("Attempting to restart service.");
myService.Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
break;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
这可能不是最好的解决方案,有些人可能会觉得有点脏。但就目前而言,这是我能找到的最好的解决办法。希望这能帮助将来有同样问题的人。我使用了下面的代码:
效果很好。唯一需要提及的是,这是针对SQL2005-SQL2008的。您必须检查ComputerManagement11 for SQL 2012。您尝试过该功能吗?还没有,这是我的新功能。我将对此进行研究,并在稍后报告我的发现。好的,我对NetServerEnum函数进行了一些研究。它确实返回了一些所需的数据,但看起来它仍然依赖于与SqlDataSourceEnumerator相同的东西。只是在本地网络上运行,并没有提供网络上的所有sql server实例。与NetServerEnum的结果完全相同。正如您所说,许多人以前都问过这个问题,但不清楚为什么您的问题不同。您需要哪些使用上述方法无法找到的准确信息?如果选项2返回的“数据”比你需要的多,为什么不过滤或解析它,只提供你需要的信息呢?嘿,Pondlife,谢谢你的回复。问题在于选项2的查询速度非常慢。大约需要3-4分钟才能完成。如果您需要查询到大约80台机器,那么这不是很有用。返回更多数据的事实是,它返回已安装产品列表中包含“sql”的所有内容。我不确定是否可以使wmi查询更具体,同时仍然让它获取所有实例。至于其他主题没有为我提供正确解决方案的原因,是它们过时了,结果不可靠,或者只针对一个或两个特定版本。我一直在寻找一个不需要SQL Browser的解决方案。这很好用。谢谢!:)
public static void SqlTestInfo()
{
SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance;
DataTable table = instance.GetDataSources();
DisplayData(table);
}
private static void DisplayData(DataTable table)
{
foreach (DataRow row in table.Rows)
{
foreach (DataColumn dataColumn in table.Columns)
{
Console.WriteLine("{0} = {1}", dataColumn.ColumnName, row[dataColumn]);
}
Console.WriteLine();
}
}