以编程方式查找sql​​ server的所有实例

时间:2012-11-13 15:08:55

标签: c# sql-server wmi

我知道有很多类似于这个的主题,但没有一个提供我正在寻找的正确答案。

我正在努力收集网络上的所有SQL-Server实例。它应该能够检测正在运行的SQl-Server的版本。我们运行的不同版本在“SQL Server 2000”和“SQL Server 2008 R2

之间有所不同

为了向您提供一些背景信息,目前我正在我们的本地网络上进行开发,但稍后将在我们的服务器上运行以收集信息。

收集的一些信息是:

  • 应用程序池
  • iis装置
  • 服务器上的所有数据库
  • 还有更多像这样的东西

通过WMI查询,以上所有工作都没有问题。但我无法通过WMI或Visual Studio 2010中的命名空间获得正确的SQl-Server实例。

根据其他解决方案在stackoverflow和其他网站上找到的一些我尝试过的东西:

  1. WMI,使用不同的名称空间,例如root\\Microsoft\\SqlServer\\ComputerManagement10ServerSettings类。但这只给SQLSERVER和SQLEXPRESS提供了版本号。让它变得毫无用处。
  2. 我也试过root\\CIMV2 Win32_Product,包括类似sql子句的地方。但这会返回比我正在寻找的更多的数据。此外,查询本身非常慢。
  3. 后来我在Visual Studio中找到了一些类,例如SqlDataSourceEnumerator。虽然这仅在某个服务正在运行且某些端口处于打开状态时才有效。由于可能的安全问题和可能的错误数据,我们最好不要这样做
  4. 我还看到一些人引用了一些其他命名空间(一旦我再次找到它们就会将它们写在这里),但msdn表示我们将在不久的将来删除这些命名空间。
  5. 总结一下:我需要检索域上SQL-Server的所有已安装实例,其版本在2000到2008 R2之间变化。

2 个答案:

答案 0 :(得分:9)

好的,我解决了这个问题。我所做的是一些事情:

  • 首先,我扫描域名以查找机器。
  • 检查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();
    }
}

它可能不是最好的解决方案,有些可能会觉得有点脏。但就目前而言,这是我能得到的最好的解决方法 希望这可以帮助将来遇到同样问题的人。

答案 1 :(得分:3)

我使用了此处的代码:http://msdn.microsoft.com/en-us/library/dd981032.aspx

效果很好。唯一值得一提的是这是针对SQL 2005 - SQL 2008.您必须检查SQLMan的ComputerManagement11。