Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式查找sql server的所有实例_C#_Sql Server_Wmi - Fatal编程技术网

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

C# 以编程方式查找sql server的所有实例,c#,sql-server,wmi,C#,Sql Server,Wmi,我知道有相当多的主题类似于这一个,但没有一个提供了正确的答案,我正在寻找 我正在努力收集我们网络上的所有SQL Server实例。它应该能够检测正在运行的SQl Server版本。我们运行的不同版本在“SQLServer2000”和“SQLServer2008R2”之间有所不同 给你们一点背景信息,目前我正在开发我们的本地网络,但稍后它将在我们的服务器上运行以收集信息 收集到的一些信息包括: 应用程序池 iis安装 服务器上的所有数据库 还有更多像这样的东西 通过WMI查询,这一切都可以正常

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

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

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

收集到的一些信息包括:

  • 应用程序池
  • iis安装
  • 服务器上的所有数据库
  • 还有更多像这样的东西
通过WMI查询,这一切都可以正常工作。但我无法通过WMI或VisualStudio2010中的名称空间获得SQl Server的正确实例

根据stackoverflow和其他网站的其他解决方案,我尝试了以下几点:

  • WMI,使用不同的名称空间,如
    root\\Microsoft\\SqlServer\\ComputerManagement10
    ServerSettings
    类。但这只提供SQLSERVER和SQLEXPRESS,没有版本号。让它变得毫无用处
  • 我还尝试了
    root\\CIMV2 Win32\u产品
    ,包括where like sql子句。但这返回的数据远不止我要寻找的数据。此外,查询本身非常慢
  • 后来,我在Visual Studio中发现了一些类,例如
    SqlDataSourceEnumerator
    。尽管这仅在特定服务正在运行且某些端口已打开时才起作用。由于可能的安全问题和可能的错误数据,我们最好不要这样做
  • 我还看到一些人引用了一些其他名称空间(一旦我再次找到它们,将在这里编写它们),但msdn表示,我们将在不久的将来删除这些名称空间

  • 总而言之:我需要检索版本在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();
        }
    }