我们有一个特殊的多值属性。我们称之为ourOwnManagedBy
,它可以包含管理当前组的用户或组(他们的DN)。
如何检索特定用户管理的所有群组的列表(借助managedBy
和ourOwnManagedBy
)?
例如。假设用户是GlobalAdministrators组的成员,并且ApplicationAdministrators组具有GlobalAdministrations作为成员。最后是MyApplication组,其中包含ourOwnManagedBy
属性中的ApplicationAdministrators。
User
是GlobalAdministrators
GlobalAdministrators
是ApplicationAdministrators
MyApplication
在ApplicationAdministrators
ourOwnManagedBy
如何使用该信息查找特定用户管理的所有组?是否可以对自定义属性(包含用户和组的DN)进行某种递归检查?
更新
我试过使用这样的目录搜索过滤器:
string.Format("(ourOwnManagedBy:1.2.840.113556.1.4.1941:={0})", dn);
但我可能误解了1.2.840.113556.1.4.1941
的作用? (MSDN page)
答案 0 :(得分:1)
我担心,只有一个LDAP查询无法完成。您将不得不将其拆分为子查询并单独运行每个子查询,如果有很多要迭代的话,这反过来会阻塞域控制器。
我尝试按照我描述的方式进行操作,性能非常糟糕,至少使用.NET的可用模块进行操作。
答案 1 :(得分:0)
以下页面显示3.1.1.3.4.4 LDAP Matching Rules (extensibleMatch)表示您使用的LDAP_MATCHING_RULE_TRANSITIVE_EVAL在Windows 2008及更高版本中有效。如果您使用的是2003,则可能无效。
答案 2 :(得分:0)
没有递归,也不知道如何表现性能,可能有错误。
string user = "username";
//get domain
DirectoryEntry de = System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain().GetDirectoryEntry();
//get users dn first
string userDN;
using (var searcher = new DirectorySearcher(de))
{
searcher.Filter = String.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0}))", user);
searcher.PropertiesToLoad.Add("distinguishedName");
userDN = searcher.FindOne().Properties["distinguishedName"][0].ToString();
}
//get list of all users groups
List<string> groups;
//see http://stackoverflow.com/questions/6252819/find-recursive-group-membership-active-directory-using-c-sharp
using (var searcher2 = new DirectorySearcher(de))
{
searcher2.Filter = String.Format("(member:1.2.840.113556.1.4.1941:={0})", userDN);
searcher2.SearchScope = SearchScope.Subtree;
searcher2.PropertiesToLoad.Add("distinguishedName");
SearchResultCollection src = searcher2.FindAll();
groups = (from SearchResult c in src
select c.Properties["distinguishedName"][0].ToString()).ToList();
}
//build giant search query
SearchResultCollection srcGroups;
using (var searcher = new DirectorySearcher(de))
{
string baseString = "(|{0})";
string managedbybase = "(managedBy={0})";
//I've read that you can search multivalued lists using a standard ='s.
string ourOwnManagedByBase = "(ourOwnManagedBy={0})";
StringBuilder sb = new StringBuilder();
//add user DN to list of group dn's
groups.Add(userDN);
foreach (string g in groups)
{
sb.AppendFormat(managedbybase, g);
sb.AppendFormat(ourOwnManagedByBase, g);
}
searcher.Filter = string.Format(baseString, sb.ToString());
srcGroups = searcher.FindAll();
}
我会诚实地说,这实际上并不适合我:)但我认为这是因为我们的域名配置方式。如果没有其他可能它会推动你走向正确的方向。