2012-11-13 52 views
2

我知道這裏有很多相似的主題,但沒有一個提供了我正在尋找的正確答案。以編程方式查找sql​​ server的所有實例

我很努力地收集我們網絡上的所有SQL-Server實例。它應該能夠檢測到SQl-Server正在運行的版本。我們已經在運行不同版本的「SQL Server 2000」和「SQL Server 2008 R2

之間變化給你提供一些背景資料,我目前我們的本地網絡上開發,但後來它會在我們的服務器上運行,來收集信息。

一些收集到的信息是:

  • 應用程序池
  • IIS的服務器
  • 和一些像這樣的東西

這一切上方安裝

  • 所有數據庫通過WMI查詢正在工作沒有問題。但我不能讓Visual Studio中通過WMI或SQL-Server的正常情況下,2010年的命名空間

    一些我已經根據各地計算器和其他網站找到其他的解決辦法試過的東西:

    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實例。

  • +0

    你試過[NetServerEnum(http://msdn.microsoft.com/en-us /library/windows/desktop/aa370623%28v=vs.85%29.aspx)函數? – RRUZ

    +0

    還沒有,對我來說這是一個新的。我會仔細研究一下並在稍後報告我的發現。 – AssaultingCuccos

    +0

    好,所以我用NetServerEnum函數玩了一下。它確實會返回一些所需的數據,但看起來好像它仍然依賴於與SqlDataSourceEnumerator相同的東西。只是在本地網絡上運行它,並沒有提供網絡上的所有sql-server實例。與NetServerEnum的結果完全相同。 – AssaultingCuccos

    回答

    8

    好吧,所以我解決了這個問題。我所做的是幾件事情:

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

    然後這就是我用來檢索實例。

    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(); 
        } 
    } 
    

    它可能不是最好的解決方案,有些人可能會覺得它有點髒。但現在這是我能得到的最好的解決方法。
    希望這有助於任何人在未來有同樣的問題。

    3

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

    很好用。只提的是,這是對SQL 2005 - 2008年的SQL你必須檢查ComputerManagement11用於SQL 2012

    +1

    我一直在尋找一種不需要SQL Browser的解決方案。 。這個工作正常。謝謝 ! :) –

    相關問題