【发布时间】:2014-04-09 12:52:48
【问题描述】:
我已尝试从 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 - 那么你想通过使用旧式的、遗留的第二种方法来实现什么?您希望从中获得什么好处? -
好吧,不知道 PrincipalContext 也使用 LDAP。我可以使用 LDAP 语法和 PrincipalContext 连接到目录吗?例如:服务器名:myServer 端口:389 DC=example,DC=com
-
如果您需要了解此类信息 - 您应该始终想一想:MSDN 在线文档!。查看MSDN docs on
PrincipalContextand the availanle constructor overloads - 它们允许您指定要连接的服务器和域,以及要使用的凭据(如果需要) -
我查看了 MSDN 文档。但我仍然不知道如何连接到以下 LDAP: ldap.andrew.cmu.edu 我试过了: using (var domainContext = new PrincipalContext(ContextType.Domain, "ldap.andrew.cmu.edu", " cn=log"))
-
或任何其他无 AD 服务器(OpenLDAP 和 co)
标签: c# active-directory ldap active-directory-group