2014-12-04 4 views
0

я не знаю, если «вложенная» это слово для того, что мне нужно, но вот объяснение:Получить группы пользователей в AD с вложенными группами

У меня есть пользователь, «Джон». «Джон» является членом группы «А». Группа «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(); 

Как я могу добиться этого?

Спасибо!

+0

[Перечисление вложенных групп пользователей в AD] (http://stackoverflow.com/questions/7149157/enumeration-of-nested-ad-user-groups-using-c-sharp) проверьте это предыдущее сообщение 'Nicole ' – MethodMan

+0

Это не одно и то же, потому что я начинаю с пользователя, я получаю его прямые группы, и мне нужно знать, является ли какая-либо из этих групп одновременно, членом другой группы. – Nicole

+0

- это случайная опечатка/(& (sAmAccountName) не уверен, если это имеет значение, но я думаю, что это должно быть 'samAccountName', вы также можете добавить' && (objectClass = groups)) ' – MethodMan

ответ

0

В результате я использовал свойство «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; 
    } 
} 

Это смесь из this и this ссылки, где objectSid является objectSID группы, которые я нахожу по имени.

Большое спасибо за помощь!

Смежные вопросы