Active Directory:检索用户信息

时间:2008-09-25 09:16:34

标签: c# active-directory

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

5 个答案:

答案 0 :(得分: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 schema reference会很有用。请理解可以修改和扩展架构(例如,安装Exchange会将邮箱信息添加到用户)。

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

答案 1 :(得分: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));
}

答案 2 :(得分:5)

答案 3 :(得分:1)

查看System.DirectoryServices名称空间:

System.DirectoryServices Namespace

答案 4 :(得分:0)

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