我尝试从LDAP中加载用户的所有组。
目前,我正在本地AD上进行测试。使用以下代码,我可以加载给定用户的所有组:
public IEnumerable<String> GetUserGroups( String userName )
{
using ( var domainContext = new PrincipalContext( ContextType.Domain, Name ) )
{
var user = UserPrincipal.FindByIdentity( domainContext, userName );
return user.GetAuthorizationGroups().Select( x => x.Name} ).ToList();
}
}
但是我使用LDAP无法获得相同的结果。
使用LDAP的代码:
public IEnumerable<String> GetUserGroups1(String userName)
{
//returns the container name of the given user
var containerName = GetUserContainerName(userName);
var groups = new List<String>();
if (containerName == null)
return groups;
var entry = new DirectoryEntry(String.Format("LDAP://{0}", "DC=example,DC=com"));
var searcher = new DirectorySearcher(entry)
{
Filter = String.Format("(member:{0}:=CN={1},{2},{3})",
"1.2.840.113556.1.4.1941",
containerName, "CN=Users", "DC=example,DC=com"),
SearchScope = SearchScope.Subtree
};
var result = searcher.FindAll();
for (var i = 0; i < result.Count; i++)
{
var path = result[i].Path;
var startIndex = path.IndexOf("CN=", StringComparison.Ordinal) + 3;
groups.Add(path.Substring(startIndex, path.IndexOf(",", startIndex + 1,
StringComparison.Ordinal) - startIndex));
}
return groups;
}
如何使用LDAP获取用户的所有组?
PrincipalContext
和UserPrincipal
,同样也在底层使用LDAP - 那么通过使用旧式的、遗留的第二种方法,您想要实现什么?您希望从中获得什么好处? - marc_sPrincipalContext
和可用构造函数重载的MSDN文档 - 这些允许你指定要连接到的服务器和域,以及使用什么凭据(如果需要)。 - marc_s