[英]Find all instances of sql server programmatically
我知道有很多類似於這個的主題,但沒有一個提供我正在尋找的正確答案。
我正在努力在我們的網絡上收集所有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
。 雖然這僅在某個服務正在運行且某些端口處於打開狀態時才有效。 由於可能的安全問題和可能的錯誤數據,我們最好不要這樣做 總結一下:我需要在一個版本在2000和2008 R2之間變化的域上檢索所有已安裝的SQL-Server
實例。
好的,我解決了這個問題。 我所做的是一些事情:
system.ServiceProcess
的ServiceController class
完成的 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();
}
}
它可能不是最好的解決方案,有些可能會覺得有點臟。 但就目前而言,這是我能得到的最好的解決方法。
希望這可以幫助將來遇到同樣問題的人。
我使用了這里的代碼: http : //msdn.microsoft.com/en-us/library/dd981032.aspx
效果很好。 唯一要提的是這是針對SQL 2005 - SQL 2008.您將需要檢查SQLMan的ComputerManagement11。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.