2011-03-21 151 views
1

我試圖綁定到Active Directory服務器在C#中,但在現場我似乎已經在測試環境中不能重現的問題。無法連接到AD沒有專門連接到DC

我發現了一個異常

System.Runtime.InteropServices.COMException (0x8007203A): The server is not operational. 
    at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 
    at System.DirectoryServices.DirectoryEntry.Bind() 
    at System.DirectoryServices.DirectoryEntry.RefreshCache() 
    at System.DirectoryServices.DirectoryEntry.FillCache(String propertyName) 
    at System.DirectoryServices.DirectoryEntry.get_NativeGuid() 

的代碼看起來像這樣

// domainStr = "LDAP://domainname/rootDSE 
using (var de = new DirectoryEntry(domainStr, Username, Password)) 
{ 
    var guid = de.NativeGuid; 
} 

但是如果我嘗試連接的域控制器,而不是(domainStr = "LDAP://domainController/rootDSE"或完全合格domainStr = "LDAP://domainController.DomainName"),它工作得精細。

我試圖

var d = Domain.GetDomain(new DirectoryContext(
      DirectoryContextType.Domain, 
      domainStr, 
      Username, 
      Password)); 

但這樣做,當我得到完全相同的異常。

我想知道如果我做錯了什麼,也許不同的LDAP URL會更好地工作,或者如果這是我在(即使谷歌搜索帶來了這個問題一個共同的問題我還沒有找到一個解決方案這對我很有用)

另外它可能值得指出的是,運行該軟件的服務器不在任何Active Directory中,並且我有一個我連接到的AD列表(因此在嘗試使用用戶名和密碼時連接)

+0

是你使用的「現場」是域的成員這臺機器?如果沒有,你需要指定一個特定的域用戶+密碼才能做任何事情。另外,我相信正確的LDAP路徑只是「LDAP:// RootDSE」 - 是否爲您工作? – 2011-03-21 08:02:42

+0

我不確定你是什麼意思!但可以肯定的是,使用C#,即使您的計算機不是Domain的成員,也可以通過指定DCs IP/Name/Address來連接到AD。 – 2011-03-21 09:00:47

+0

該機器不是域的成員(因此我不能只連接到LDAP:// RootDSE)。 但是我在嘗試連接時確實使用了用戶名和密碼,但仍然得到上述異常,除非我明確指定域控制器。 – clows 2011-03-21 11:52:01

回答

2

這是因爲DNS服務器沒有域的A記錄。當您向域名傳遞域名時,DNS服務器不知道要解析哪個IP地址。通常,你沒有這個問題,因爲默認情況下MS Windows內置的DNS服務器會爲你添加這個A記錄。但是,在大型企業中,他們經常不使用MS Windows內置DNS服務器。在很多情況下,人們不願意爲域名添加A記錄。

如果可能的話,你可以問你的客戶一個A記錄添加到DNS服務器。另外,也可以讓客戶修復c:\ windows \ system32 \ drivers \ etc \ hosts文件。然後,在那裏添加一條A記錄。您可以將其指向任何一個域控制器。但是,這種方法不能擴展,因爲不同站點中的用戶都將把域名解析爲相同的IP地址。對於某些遠程站點用戶,他們可能會遇到緩慢問題。

如果你也想解決可擴展性問題,你可以考慮模擬用戶,而不是通過用戶名密碼進入DirectoryEntry的。一旦你模擬一個域用戶,你可以使用像這樣的無服務器綁定LDAP://RootDSE