2011-04-15 61 views
1

我試圖通過c#獲取當前的域控制器名稱。此代碼不會在登錄會話期間運行。它在機器啓動期間運行,所以我不能使用%logonserver%變量,因爲在機器啓動時沒有這樣的事情。在這裏搜索我認爲下面的代碼可以工作,但它會返回主域控制器,而不是當前的登錄服務器。 (啓動時的「登錄服務器」可能是最好被稱爲「認證服務器」)確定當前的域控制器名稱

,這並不爲我工作(不返回機器目前的DC,返回域的PDC)

using (PrincipalContext context = new PrincipalContext(ContextType.Domain)) 
     { 
      string controller = context.ConnectedServer; 
      Console.WriteLine("Domain Controller: " + controller); 
     } 

我發現下面的WMI查詢獲取積極的結果,但是,它的速度慢:

ManagementObjectSearcher搜索= 新ManagementObjectSearcher( 「ROOT \ CIMV2」, 「SELECT * FROM Win32_NTDomain」);

  foreach (ManagementObject queryObj in searcher.Get()) 
      { 
       if (queryObj["DomainControllerName"] != "") 
        Console.WriteLine("DomainControllerName: {0}", queryObj["DomainControllerName"]); 
      } 

任何人都知道更好的方法?

+2

一些思考。請記住,域中可能有**多個**域控制器,而不僅僅是一個。我們有兩個,我認爲三個是理想的,因爲有三個主要的功能域控制器可以做(這是從內存這一點上)。那麼,您認爲哪個域控制器是「當前」? – Jim 2011-04-15 00:14:10

+0

如果機器沒有登錄到域,正如您所說的「_...它在機器啓動過程中運行......」那麼用戶和機器都沒有登錄到域,我相信同樣的應用於用戶的事實適用於機器,但機器上下文還沒有_current_域控制器。我可能是錯的,但我相信這是事實。 – 2011-04-15 01:10:40

+0

感謝您的回覆。我的環境中有15或16個DC。一些物理位置有1個,有些有3個。 – 2011-04-18 13:53:08

回答

2

授予你需要包括用戶名和密碼,但是這應該做的伎倆:

DirectoryContext domainContext = new DirectoryContext(DirectoryContextType.Domain, "targetDomainName", "validUserInDomain", "validUserPassword"); 

    var domain = System.DirectoryServices.ActiveDirectory.Domain.GetDomain(domainContext); 
    var controller = domain.FindDomainController(); 
+0

哇,我從來沒有注意到,直到現在......工程太棒了! Domain domain = Domain.GetCurrentDomain(); var controller = domain.FindDomainController(); Console.WriteLine(controller.ToString()); – 2013-08-29 17:32:42

相關問題