10

我有一个使用我们的 Active Directory 针对 Windows 身份验证运行的 Web 应用程序。我有一个新要求,即从 Active Directory 条目中提取一些个人信息。获取此信息的最简单方法是什么?

4

5 回答 5

17

通过 DirectoryEntry 直接访问用户似乎是最直接的方法。以下是我从我的第一个 AD 相关项目中学到的一些与 AD 相关的花絮:

  • 在 URI 中,将 LDAP 写成小写。否则你会得到一个神秘的错误。我花了一天多的时间在这个令人沮丧的问题上......
  • 要清除单值属性,请将其设置为空字符串,而不是 null。Null 导致异常。
  • 要清除多值属性,请使用DirectoryEntry.Property.Clear()方法。
  • Active Directory 架构参考将说明值将是哪种数据类型以及它是多值还是单值。
  • 您不需要在 Directoryentry 上手动 RefreshCache(),但如果您曾经使用它并指定要缓存的属性,请知道它将来不会自动检索任何其他属性。
  • 绝对可以在您使用 System.DirectoryServices 中的类的任何时候引发 COMException。留意那些尝试块。不要假设任何事情都是安全的。

如果您不知道它的路径(您不会,只需让他登录),您可能需要使用 DirectorySearcher 来获取用户的目录条目。使用它相当容易,但要注意 LDAP 语法中的怪癖;即,必须对非 ASCII(和其他?)字符进行编码。您使用的搜索字符串可能类似于:(&(sAMAccountName=whatever)(class=user))。这不是我的想法,可能有点不正确。

Active Directory 架构参考将很有用。请务必了解架构可以修改和扩展(例如,安装 Exchange 将向用户添加邮箱信息)。

AD Explorer是一个有用的工具,可用于调试和低级 AD 数据管理。当我知道要设置哪个属性但在 AD 管理工具中找不到正确的对话框时,我发现它很有用。

于 2008-09-25T09:35:09.367 回答
5

您可能会发现以下代码片段作为入门非常有用。

public static bool IsUserInGroup(string lanid, string group)
{
    DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPPATH);
    if(entry != null)
    {
        entry.Username=@"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));
}
于 2008-09-25T09:37:12.700 回答
5

一个很好的参考:Howto: (Almost) Everything In Active Directory via C#

于 2008-09-25T09:44:55.817 回答
1

看看 System.DirectoryServices 命名空间:

System.DirectoryServices 命名空间

于 2008-09-25T09:23:45.777 回答
0

我使用标准 LDAP 库从 Active Directory 服务器检索信息,但您必须验证您需要的数据是否可通过 LDAP 服务器的模式获得。通常,您可以获得存储在 InetOrganizationalPerson 中的任何信息以及与它们所属的组相关的大部分信息。

于 2008-09-25T09:20:55.360 回答