活动目录:检索用户信息
我有一个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管理工具中找到正确的对话框时,我发现它很有用。
我已经使用标准LDAP库从Active Directory服务器检索信息,但是您必须通过LDAP服务器的模式验证您需要的数据是否可用。一般来说,您可以获取存储在InetOrganizationalPerson中的任何信息以及与其所属组织有关的大部分信息。
看一看System.DirectoryServices命名空间:
+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));
}
刚刚完成一些代码基本上是你说的。使用DirectoryHarcher,并获取我需要的信息。幸运的是,我只需要检索非常基本的信息。 – 2008-09-25 09:37:45
对我来说,写小写的ldap抛出了一个COMException。 – 2013-04-24 08:48:02