2

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

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

给你一点背景信息,目前我正在我们的本地网络上开发,但稍后它将在我们的服务器上运行以收集信息。

收集到的一些信息是:

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

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

我根据stackoverflow和其他网站周围的其他解决方案尝试过的一些事情:

  1. root\\Microsoft\\SqlServer\\ComputerManagement10WMI,使用不同的命名空间,例如ServerSettings类。但是这只给出了没有版本号的 SQLSERVER 和 SQLEXPRESS。让它有点没用。
  2. 我还尝试root\\CIMV2 Win32_Product包含一个 where like sql 子句。但这会返回比我正在寻找的更多的数据。另外查询本身很慢。
  3. 后来我在 Visual Studio 中找到了一些类SqlDataSourceEnumerator,例如。尽管这仅在某个服务正在运行并且某些端口打开时才有效。由于可能的安全问题和可能的不正确数据,我们最好不要这样做
  4. 我还看到一些人提到了一些其他的命名空间(一旦我再次找到它们就会在这里写出来),但是 msdn 表示这些命名空间我们将在不久的将来被删除。

总结一下:我需要检索SQL-Server版本在 2000 和 2008 R2 之间变化的域上的所有已安装实例。

4

2 回答 2

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();
    }
}

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

于 2012-11-15T09:34:11.170 回答
3

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

效果很好。唯一需要提及的是,这是针对 SQL 2005 - SQL 2008。您必须检查 ComputerManagement11 以获取 SQL 2012。

于 2014-03-25T00:31:02.180 回答