活动目录:检索用户信息

问题描述:

我有一个Web应用程序使用我们的活动目录针对Windows身份验证运行。我有一个新的要求,即通过Active Directory条目获取一些个人信息。访问这些信息最简单的方法是什么?活动目录:检索用户信息

直接通过一个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

我已经使用标准LDAP库从Active Directory服务器检索信息,但是您必须通过LDAP服务器的模式验证您需要的数据是否可用。一般来说,您可以获取存储在InetOrganizationalPerson中的任何信息以及与其所属组织有关的大部分信息。

看一看System.DirectoryServices命名空间:

System.DirectoryServices Namespace

+0

+1为一体的现代化的答案。 – 2012-10-31 16:55:30

您可能会发现下面的代码片段可用作启动器。

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)); 
}