2008-09-25 102 views
10

我有一個Web應用程序使用我們的活動目錄針對Windows身份驗證運行。我有一個新的要求,即通過Active Directory條目獲取一些個人信息。訪問這些信息最簡單的方法是什麼?活動目錄:檢索用戶信息

回答

17

直接通過一個DirectoryEntry訪問用戶似乎是最直接的方法。我從我的第一個AD相關項目中瞭解到一些與AD相關的花絮:

  • 在URI中,以小寫寫LDAP。否則,你會得到一個神祕的錯誤。我花了一天多的時間在這個令人沮喪的問題上......
  • 要清除單值屬性,請將其設置爲空字符串,而不是空值。空導致異常。
  • 要清除多值屬性,請使用DirectoryEntry.Property.Clear()方法。
  • Active Directory架構參考將說明一個值的數據類型以及它是多值還是單值。
  • 您不需要在Directoryentry上手動刷新RefreshCache(),但是如果您曾經使用它並指定要緩存的屬性,請知道它將來不會自動檢索任何其他屬性。
  • 在任何時候使用System.DirectoryServices中的類時都會拋出COMException。密切關注這些嘗試塊。不要以爲任何事情都是安全的。

如果你不知道它的路徑,你可能需要使用DirectorySearcher來獲取你的用戶的目錄條目(你不會,只要讓他登錄)。使用它很容易,但要小心LDAP語法中的怪癖;即不得不編碼非ASCII(和其他?)字符。您使用的搜索字符串可能類似於:(&(sAMAccountName = whatever)(class = user))。這是我的頭頂,可能稍微不正確。

Active Directory schema reference將會有用。請理解可以修改和擴展架構(例如,安裝Exchange將向用戶添加郵箱信息)。

AD Explorer是一個有用的工具,您可以使用它進行調試和低級AD數據管理。當我知道我要設置哪個屬性,但無法在AD管理工具中找到正確的對話框時,我發現它很有用。

+0

剛剛完成一些代碼基本上是你說的。使用DirectoryHarcher,並獲取我需要的信息。幸運的是,我只需要檢索非常基本的信息。 – 2008-09-25 09:37:45

+0

對我來說,寫小寫的ldap拋出了一個COMException。 – 2013-04-24 08:48:02

0

我已經使用標準LDAP庫從Active Directory服務器檢索信息,但是您必須通過LDAP服務器的模式驗證您需要的數據是否可用。一般來說,您可以獲取存儲在InetOrganizationalPerson中的任何信息以及與其所屬組織有關的大部分信息。

5

您可能會發現下面的代碼片段可用作啓動器。

public static bool IsUserInGroup(string lanid, string group) 
{ 
    DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPPATH); 
    if(entry != null) 
    { 
     [email protected]"LDAPUSER"; 
     entry.Password="LDAPPASSWORD"; 
     DirectorySearcher srch = new DirectorySearcher(entry); 
     srch.Filter = String.Format("(&(objectClass=person)(sAMAccountName={0}))", lanid); 
     srch.PropertiesToLoad.Add("memberOf"); 

     SearchResult result = srch.FindOne(); 
     if(result != null) 
     { 
      if(result.Properties.Contains("memberOf")) 
      { 
       string lookfor = String.Format("cn={0},", group.ToLower()); 
       foreach(string memberOf in result.Properties["memberOf"]) 
       { 
        if(memberOf.ToLower().StartsWith(lookfor)) 
         return true; 
       } 
      } 
     } 
     return false; 
    } 
    throw new Exception(String.Format("Could not get Directory lanid:{0}, group{1}", lanid, group)); 
}