我知道,有与此类似的不少科目,但它们都没有提供正确的答案,我期待的。
我奋力收集SQL-Server的所有实例我们的网络上。 它应该能够检测哪些SQL-Server的版本运行。 我们有运行不同版本的“有所不同SQL Server 2000
”和“ SQL Server 2008 R2
”
为了给你提供一些背景信息,目前我正在开发我们的本地网络上,但后来它会在我们的服务器上运行,来收集信息。
一些收集到的信息是:
- 应用程序池
- 在iis安装
- 一台服务器上的所有数据库
- 而一些这样的东西
这一切都以上通过WMI查询工作没有问题。 但我不能让Visual Studio 2010的内WMI或命名空间的SQL服务器的正确实例。
有些我已经根据各地计算器和其他网站找到其他解决方案尝试的事情:
- WMI,使用不同的命名空间,如
root\\Microsoft\\SqlServer\\ComputerManagement10
与ServerSettings
类。 但是,这只是给SQLSERVER和SQLEXPRESS没有版本号。 使其成为一种无用的。 - 我也试过
root\\CIMV2 Win32_Product
包括像SQL子句的地方。 但是,这比返回正是我寻找更多的数据。 此外,查询本身是很慢的。 - 后来我发现Visual Studio中的一些类如
SqlDataSourceEnumerator
例如。 虽然这只是工作,如果某个服务正在运行和一些端口是开放的。 这是我们最好不要做,由于可能的安全问题和可能不正确的数据 - 我也看到有些人提到一些其他的命名空间(将它们写在这里,一旦我再次找到它们),但MSDN指出,这些命名空间我们将在不久的将来被删除。
总结:我需要检索所有已安装的情况下, SQL-Server
上与2000年和2008 R2之间不同版本的域。
好了,所以我解决了问题。 我所做的是几件事情:
- 首先,我扫描机器的域。
- 如果SQLBrowser服务运行检查,如果没有,下手吧! 这是由做
ServiceController class
位于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);
}
}
}
然后,这是我用检索实例。
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();
}
}
它可能不是最好的解决办法,有些人可能会觉得有些脏。 但现在这是我能得到最好的解决方法。
希望这有助于有同样的问题在未来的任何人。
我使用的代码从这里: http://msdn.microsoft.com/en-us/library/dd981032.aspx
伟大的作品。 唯一要提的是,这是2005年的SQL - SQL 2008年你必须检查ComputerManagement11的SQL 2012。