2011-06-20 15 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を計算します(ひどく)、RIDを含むprimaryGroupIDのユーザーを検索します。

/* 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]); 
} 
関連する問題