簡體   English   中英

以編程方式查找sql​​ server的所有實例

[英]Find all instances of sql server programmatically

我知道有很多類似於這個的主題,但沒有一個提供我正在尋找的正確答案。

我正在努力在我們的網絡上收集所有SQL-Server實例。 它應該能夠檢測正在運行的SQl-Server的版本。 我們運行的不同版本在“ SQL Server 2000 ”和“ SQL Server 2008 R2 ”之間有所不同

為了給你一些背景信息,目前我正在我們的本地網絡上開發,但稍后它將在我們的服務器上運行以收集信息。

收集的一些信息是:

  • 應用程序池
  • iis安裝
  • 服務器上的所有數據庫
  • 以及更多像這樣的東西

通過WMI查詢,以上所有工作都沒有問題。 但我無法通過WMI或Visual Studio 2010中的命名空間獲得正確的SQl-Server實例。

我根據其他解決方案在stackoverflow和其他站點周圍發現的一些事情:

  1. WMI,使用不同的命名空間,例如root\\\\Microsoft\\\\SqlServer\\\\ComputerManagement10ServerSettings類。 但這只給SQLSERVER和SQLEXPRESS提供了版本號。 讓它變得毫無用處。
  2. 我也試過root\\\\CIMV2 Win32_Product包括一個類似sql子句的地方。 但這會返回比我正在尋找的更多的數據。 此外,查詢本身非常慢。
  3. 后來我在Visual Studio中找到了一些類,例如SqlDataSourceEnumerator 雖然這僅在某個服務正在運行且某些端口處於打開狀態時才有效。 由於可能的安全問題和可能的錯誤數據,我們最好不要這樣做
  4. 我還看到一些人引用了一些其他命名空間(一旦我再次找到它們就會將它們寫在這里),但msdn表示我們將在不久的將來刪除這些命名空間。

總結一下:我需要在一個版本在2000和2008 R2之間變化的域上檢索所有已安裝的SQL-Server實例。

好的,我解決了這個問題。 我所做的是一些事情:

  • 首先,我掃描域名的機器。
  • 檢查SQLBrowser服務是否正在運行,如果沒有,請啟動它! 這是由位於system.ServiceProcessServiceController class完成的
  • 在所有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();
    }
}

它可能不是最好的解決方案,有些可能會覺得有點臟。 但就目前而言,這是我能得到的最好的解決方法。
希望這可以幫助將來遇到同樣問題的人。

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

效果很好。 唯一要提的是這是針對SQL 2005 - SQL 2008.您將需要檢查SQLMan的ComputerManagement11。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM