2012-09-12 140 views
3

我有一個Intranet需要在AD系統中爲用戶運行查詢。我嘗試使用DirectoryEntry()對象進行連接,然後設置DirectorySearcher()併爲用戶執行搜索。歸結爲這是最基本的,我的代碼是這樣的:DirectoryEntry()在.NET 4.0中工作,但在.NET 3.5中不工作?

DirectoryEntry directoryObject = new DirectoryEntry("LDAP://RD-HQ/CN=Users,DC=rd-hq,DC=local"); 
DirectorySearcher ds = new DirectorySearcher(directoryObject); 
ds.Filter = ("(&(objectClass=user))"); 
var test = ds.FindAll(); 
foreach (SearchResult item in test) 
{ 
} 

古怪,這個工程我的機器上時,我引用的System.DirectoryServices DLL的.NET4.0版本,但不是在.NET3。 5(其中System.DirectoryServices DLL的版本是v2.0.0.0)。

特定的錯誤我得到的是對ds.FindAll()方法中記載:

異常詳細信息:System.DirectoryServices.DirectoryServicesCOMException:發生操作錯誤。

單步執行代碼表明directoryObject對象實際上並未在第一行正確初始化。構造函數不會失敗,但所有屬性都拋出異常。

任何想法我可能做錯了什麼?謝謝,我意識到這是一個蹩腳,模糊的問題。


解決

OK,我設法通過使用重載接受了一個用戶名和密碼的DirectoryEntry()構造函數來解決這個問題:

DirectoryEntry directoryObject = new DirectoryEntry("LDAP://RD-HQ/CN=Users,DC=rd-hq,DC=local", "rd-hq.local\mick", "notmypassword"); 

我仍然不知道爲什麼這在.NET3.5版本和.NET4.0版本中的作用是不同的,並且會很高興地標記爲正確的答案,至少可以幫助我更好地理解這些東西。

回答

5

該構造函數不會失敗,但所有的屬性都拋出異常。

DirectoryEntry實例會在您訪問某個相關屬性時嘗試綁定到目錄 - 如果失敗,屬性訪問器將拋出異常。如果您嘗試查看調試器的屬性,也會發生這種情況。

在上面的代碼中,綁定發生在調用ds.FindAll()時。

顯然有一個綁定到目錄的問題。

我很難相信.NET Framework版本有所作爲;我會將你的代碼剝離爲一個簡單的例子,你使用相同的代碼和.NET 3.5和.NET 4版本的相同環境。

錯誤消息「發生操作錯誤」相當普遍,但如果您無權訪問目錄,則可能發生此錯誤。所以有一種可能性是你的.NET 3.5和.NET 4版本以不同的身份運行。至少這似乎是this similar problem的原因。

由DirectoryCOMException返回的ErrorCode也可能提供線索。

+0

謝謝,很好的信息。我意識到在這樣的問題中存在很多變量,因此無法給出明確的答案(什麼是IIS設置,什麼是AD設置,Web.config文件中有什麼?)。但肯定你說過的話有幫助。 –

相關問題