我知道有很多类似于这个的主题,但没有一个提供我正在寻找的正确答案.
我正在努力在我们的网络上收集所有SQL-Server实例.它应该能够检测正在运行的SQl-Server的版本.我们运行的不同版本在' SQL Server 2000'和' SQL Server 2008 R2' 之间有所不同
为了给你一些背景信息,目前我正在我们的本地网络上开发,但稍后它将在我们的服务器上运行以收集信息.
收集的一些信息是:
通过WMI查询,以上所有工作都没有问题.但我无法通过WMI或Visual Studio 2010中的命名空间获取正确的SQl-Server实例.
我根据其他解决方案在stackoverflow和其他站点周围发现的一些事情:
root\\Microsoft\\SqlServer\\ComputerManagement10使用ServerSettings类.但这只给SQLSERVER和SQLEXPRESS提供了版本号.让它变得毫无用处.root\\CIMV2 Win32_Product包含sql子句的地方.但这会返回比我正在寻找的更多的数据.此外,查询本身非常慢.SqlDataSourceEnumerator,例如.虽然这仅在某个服务正在运行且某些端口处于打开状态时才有效.由于可能的安全问题和可能的错误数据,我们最好不要这样做总结一下:我需要检索SQL-Server域的所有已安装实例,其版本在2000和2008 R2之间变化.
好的,我解决了这个问题.我所做的是一些事情:
ServiceController class位于system.ServiceProcessSqlDataSourceEnumerator枚举所有实例.对于那些对代码感兴趣的人:
注意:您需要网络管理员权限才能在远程计算机上启动它.
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后这就是我用来检索实例的东西.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
它可能不是最好的解决方案,有些可能会觉得有点脏.但就目前而言,这是我能得到的最好的解决方法.
希望这可以帮助将来遇到同样问题的人.
| 归档时间: |
|
| 查看次数: |
21336 次 |
| 最近记录: |