1

我不知道“嵌套”是否是我需要的词,但这是解释:

我有一个用户,“约翰”。“John”是组“A”的成员。组“B”有组“A”作为成员。

因此,传递性地,“John”也应该是组“B”的成员。

当我检索约翰的组时,我只得到“A”,而不是“B”,这样做是这样的:

DirectorySearcher searcher = new DirectorySearcher();
DirectoryEntry rootEntry = new DirectoryEntry(_ldap, _loginName, _password, AuthenticationTypes.ReadonlyServer);

searcher.SearchRoot = rootEntry;
searcher.SearchScope = SearchScope.Subtree;
searcher.Filter = "(&(sAMAccountName=" + filter.Split('\\')[1] + ")(objectClass=user))";
searcher.PropertiesToLoad.Add("memberOf");
searcher.PropertiesToLoad.Add("displayname");

SearchResult sr = searcher.FindOne();

我怎样才能做到这一点?

谢谢!

4

1 回答 1

3

我最终使用了用户的“tokenGroups”属性,它似乎返回了用户所在的所有组,甚至是他是可传递成员的组。

这是我的代码:

DirectorySearcher searcher = new DirectorySearcher();
DirectoryEntry rootEntry = new DirectoryEntry(_ldap, _loginName, _password, AuthenticationTypes.ReadonlyServer);

searcher.SearchRoot = rootEntry;
searcher.SearchScope = SearchScope.Subtree;
searcher.Filter = "(&(sAMAccountName=" + filter.Split('\\')[1] + ")(objectClass=user))";
searcher.PropertiesToLoad.Add("memberOf");
searcher.PropertiesToLoad.Add("displayname");

SearchResult sr = searcher.FindOne();
DirectoryEntry userDirectoryEntry = result.GetDirectoryEntry();
userDirectoryEntry.RefreshCache(new string[] { "tokenGroups" });

foreach (byte[] byteEntry in userDirectoryEntry.Properties["tokenGroups"])
{
   if (CompareByteArrays(byteEntry, objectSid))
   {
         isMember = true;
         break;
   }
}

它是这个链接和这个链接的混合体其中objectSid是我按名称找到的组的 objectSID。

非常感谢你的帮助!

于 2014-12-05T14:59:37.163 回答