2011-06-20 5 views
0

Я работаю в .net 2.0 и вам нужно получить всех пользователей данной группы AD. У меня есть следующий метод, который возвращает все члены группы, но он не возвращает пользователей, у которых прошедшая группа является их основной группой. Что мне нужно сделать, чтобы включить эти пользователи?Как получить пользователей в группе, включая пользователей первичной группы

/// <summary> 
/// Gets the group child users. 
/// </summary> 
/// <param name="parentGroup">The parent group.</param> 
/// <returns></returns> 
public List<ADUser> GetGroupChildUsers(ADGroup parentGroup) 
{ 
    List<ADUser> list = new List<ADUser>(); 

    DirectoryEntry entry = GetDirectoryEntry(LdapBaseString); 

    DirectorySearcher searcher = new DirectorySearcher(entry); 
    searcher.Filter = string.Format("(&(objectCategory=person)(memberOf={0}))", parentGroup.DN); 

    searcher.PropertiesToLoad.Add("objectGUID"); 
    searcher.SizeLimit = MaxReturnCount; 

    SearchResultCollection results = searcher.FindAll(); 

    foreach (SearchResult result in results) { 
     Guid guid = new Guid((byte[])result.Properties["objectGUID"][0]); 
     list.Add(GetUserByGuid(guid)); 
    } 

    if (list.Count <= 0) { 
     return null; 
    } else { 
     return list; 
    } 
} 
+0

У меня был подобный вопрос некоторое время назад, это может помочь. Мне нужно было извлечь только машины или только имена пользователей, а не все. http://stackoverflow.com/questions/6252785/winnt-giving-to-much-information-i-need-to-narrow-down-to-just-machine-names – sealz

ответ

3

Первичная группа пользователя задается primaryGroupID атрибутом пользователя. Фактически primaryGroupID содержит RID первичной группы в строковом формате. Вот почему я сначала получаю SID группы, которую вы ищете для пользователей, затем я вычисляю (плохо) RID, и я ищу пользователей с primaryGroupID, содержащим RID.

/* Connection to Active Directory 
*/ 
DirectoryEntry deBase = new DirectoryEntry("LDAP://WM2008R2ENT:389/dc=dom,dc=fr"); 

/* Directory Search for agroup 
*/ 
string givenGrpName = "MonGrpSec"; 
DirectorySearcher dsLookFor = new DirectorySearcher(deBase); 
dsLookFor.Filter = string.Format ("(sAMAccountName={0})", givenGrpName); 
dsLookFor.SearchScope = SearchScope.Subtree; 
dsLookFor.PropertiesToLoad.Add("cn"); 
dsLookFor.PropertiesToLoad.Add("objectSid"); 

SearchResult srcGrp = dsLookFor.FindOne(); 

/* Get the SID 
*/ 
SecurityIdentifier secId = new SecurityIdentifier(srcGrp.Properties["objectSid"][0] as byte[], 0); 

/* Find The RID (sure exists a best method) 
*/ 
Regex regRID = new Regex(@"^S.*-(\d+)$"); 
Match matchRID = regRID.Match(secId.Value); 
string sRID = matchRID.Groups[1].Value; 

/* Directory Search for users that has a particular primary group 
*/ 
DirectorySearcher dsLookForUsers = new DirectorySearcher(deBase); 
dsLookForUsers.Filter = string.Format("(primaryGroupID={0})", sRID); 
dsLookForUsers.SearchScope = SearchScope.Subtree; 
dsLookForUsers.PropertiesToLoad.Add("cn"); 

SearchResultCollection srcUsers = dsLookForUsers.FindAll(); 

foreach (SearchResult user in srcUsers) 
{ 
    Console.WriteLine("{0} is the primary group of {1}", givenGrpName, user.Properties["cn"][0]); 
} 
Смежные вопросы