C# Active Directory:检索用户信息

C# Active Directory:检索用户信息,c#,active-directory,C#,Active Directory,我有一个web应用程序,它使用我们的Active Directory针对Windows身份验证运行。我有一个新的要求,从Active Directory条目中提取一些个人信息。访问此信息的最简单方法是什么?我使用标准LDAP库从Active Directory服务器检索信息,但您必须验证所需的数据是否可通过LDAP服务器的架构获得。通常,您可以获取存储在InetOrganizationalPerson中的任何信息以及与它们所属的组相关的大多数信息。请查看System.DirectoryServi

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

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

请查看System.DirectoryServices命名空间:


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

  • 在URI中,以小写形式编写LDAP。否则你会得到一个神秘的错误。我花了一天多的时间在这个令人沮丧的问题上
  • 要清除单值属性,请将其设置为空字符串,而不是null。Null导致异常
  • 要清除多值属性,请使用DirectoryEntry.property.clear()方法
  • Active Directory架构引用将说明值的数据类型以及它是多值还是单值
  • 您不需要手动刷新Directoryentry上的cache(),但如果使用它并指定要缓存的属性,则需要知道它将来不会自动检索任何其他属性
  • 可以在使用System.DirectoryServices中的类的任何时候抛出COMException。注意那些试块。不要认为任何东西都是安全的
如果您不知道用户的目录条目的路径,您可能需要使用DirectorySearcher来获取该条目(您不知道,只要让他登录即可)。使用它相当简单,但要注意LDAP语法中的怪癖;也就是说,必须对非ASCII(和其他?)字符进行编码。您可能会使用如下搜索字符串:(&(sAMAccountName=where)(class=user))。这是我的想法,可能有点不正确

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


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

您可能会发现下面的代码片段非常有用

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

一个非常好的参考资料:

刚刚完成了一些基本上就是您所说的代码。使用DirectorySearcher,获取我需要的信息。幸运的是,我只需要检索非常基本的信息。对我来说,用小写写ldap会引发一个COMException。我看了一下,但它并没有真正涵盖我要查找的内容。创建引用:)