以编程方式查找sql server的所有实例
我知道有很多类似于这个的主题,但没有一个提供我正在寻找的正确答案。
我正努力在我们的网络上收集所有SQL-Server实例。 它应该能够检测正在运行的SQl-Server的版本。 我们运行的不同版本在“ SQL Server 2000
”和“ SQL Server 2008 R2
”之间有所不同
为了给你一些背景信息,目前我正在我们的本地网络上开发,但稍后它将在我们的服务器上运行以收集信息。
收集的一些信息是:
- 应用程序池
- iis安装
- 服务器上的所有数据库
- 还有更多像这样的东西
通过WMI查询,以上所有工作都没有问题。 但我无法通过WMI或Visual Studio 2010中的命名空间获得正确的SQl-Server实例。
根据其他解决方案在stackoverflow和其他网站上找到的一些我尝试过的东西:
- WMI,使用不同的命名空间,例如
root\\Microsoft\\SqlServer\\ComputerManagement10
和ServerSettings
类。 但这只给SQLSERVER和SQLEXPRESS一个版本号。 让它变得毫无用处。 - 我也试过
root\\CIMV2 Win32_Product
包括一个类似sql子句的地方。 但这会返回比我正在寻找的更多的数据。 另外,查询本身非常慢。 - 后来我在Visual Studio中找到了一些类,例如
SqlDataSourceEnumerator
。 虽然这仅在某个服务正在运行且某些端口处于打开状态时才有效。 由于可能的安全问题和可能的错误数据,我们最好不要这样做 - 我还看到一些人引用了一些其他命名空间(一旦我再次找到它们就会将它们写在这里),但msdn表示我们将在不久的将来删除这些命名空间。
总结一下:我需要在一个版本在2000和2008 R2之间变化的域上检索所有已安装的SQL-Server
实例。
好的,我解决了这个问题。 我所做的是一些事情:
- 首先,我扫描域名的机器。
- 检查SQLBrowser服务是否正在运行,如果没有,请启动它! 这是由位于
system.ServiceProcess
的ServiceController class
完成的 - 在所有SQLBrowser启动后,我使用
SqlDataSourceEnumerator
枚举所有实例。
对于那些对代码感兴趣的人:
注意:您需要网络管理员权限才能在远程计算机上启动它。
public void StartSqlBrowserService(List 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
效果很好。 唯一需要提及的是这是针对SQL 2005 – SQL 2008.您必须检查SQLMan的ComputerManagement11。