2010-11-26 119 views
8

今天早上我發現了一個很好的方法(DirectoryEntry.Exists),它應該能夠檢查服務器上是否存在Active Directory對象。所以我嘗試了一個簡單的:如何使用憑據提供DirectoryEntry.Exists?

if (DirectoryEntry.Exists(path)) {} 

當然,它沒有任何重載提供憑據。因爲如果沒有提供證書,我得到這個例外:

登錄失敗:未知的用戶名或 錯誤的密碼。 (System.DirectoryServices.DirectoryServicesCOMException)

有沒有,讓我在AD服務器來驗證我的代碼的可能性任何其他選擇嗎?或者檢查一個對象的存在?

回答

13

在這種情況下,你不能使用像你說的靜態方法存在:

DirectoryEntry directoryEntry = new DirectoryEntry(path); 
directoryEntry.Username = "username"; 
directoryEntry.Password = "password"; 

bool exists = false; 
// Validate with Guid 
try 
{ 
    var tmp = directoryEntry.Guid; 
    exists = true; 
} 
catch (COMException) 
{ 
    exists = false; 
} 
+0

這將是我的首選解決方案,但此屬性對我來說似乎不是靜態的,請看下面的內容:http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directoryentry.username.aspx – 2010-11-26 14:31:10

0

如果運行該進程的用戶沒有調用DirectoryEntry.Exists的權限,則可以使用模擬。

這可能會有幫助(在AD背景下討論模擬):http://www.codeproject.com/KB/system/everythingInAD.aspx

順便說一句,如果你已經有了誰有權訪問你需要的一切,與該用戶爲什麼不只是過程中的用戶的憑據(如/運行方式)?

+0

謝謝。發現也像,但沒有提供我解決我的問題的後裔。 Runas在我目前的項目中確實不是一種選擇......既不冒充也不冒險,但似乎是迄今爲止最好的。 – 2010-11-26 10:17:24

1

所以回答的問題是:不可能。

最後編寫一個自己的方法來獲取DirectoryEntry的區分名稱和指定的憑據。在存在/不存在的兩種情況下,我都得到了DirectoryEntry的一個實例。爲了檢查它是否返回了有效的對象,我做了一個簡單的嘗試... catch以查看它是否導致異常。如果是這樣,它是無效的。

噁心的檢查,但它的作品。太糟糕了默認的.NET方法DirectoryEntry.Exists沒有提供過載提供憑據就像DirectoryEntry的構造......

相關問題