2011-06-15 39 views
1

我有几个组,每个组都由一个组拥有。查询ActiveDirectory用于组拥有的组,我是其中的成员

通过组别group1_owners(不知道如果它是一个命名约定) 第2组由group2_owners 管理管理...

给用户,我需要找到所有组,由组,拥有的地方用户是会员。

是否有可能在单个查询中找到这样的组?

这是我用来检查用户是否在一个组的所有者组,但不知道它是否有效。

var domain = new DirectoryEntry("LDAP://" + domainName, null, null, AuthenticationTypes.Secure);); 
DirectorySearcher searcher = new DirectorySearcher(domain); 
searcher.Filter = string.Format("(&(objectCategory=group)(cn={0}))", group); 
searcher.PropertiesToLoad.Add("managedby"); 
searcher.SearchScope = SearchScope.Subtree; 
SearchResult groupSR = searcher.FindOne(); 

var ownerGroup = new DirectoryEntry("LDAP://" + groupSR.Properties["managedby"][0],null, null, AuthenticationTypes.Secure); 
PropertyValueCollection members = ownerGroup.Properties["member"]; 
for(i=0;i<members.Count;i++) 
{ 
if(members[i].ToString()==userName) ....... 
} 
+0

您是否想要照顾一个事实:用户可以属于属于拥有您感兴趣的组的组的组?你的代码只是检查一个用户DIRCTLY是否属于管理你感兴趣的组的组。 – JPBlanc 2011-06-15 19:05:52

+0

@JBBlanc:我只需要检查,如果用户直接属于所有者组。 – 2011-06-16 11:51:47

回答

1

给定一个用户,你需要找到所有的组,由用户是其成员的组管理的组。

我不认为你可以在一个搜索中做到这一点。但是,您可以先搜索用户所属的所有组,然后搜索由这些组管理的所有组。

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

/* Search for all groups a user belongs to 
*/ 
string givenUser = "CN=user1 Users,OU=MonOu,DC=dom,DC=fr"; 
DirectorySearcher dsLookFor1 = new DirectorySearcher(deBase); 
dsLookFor1.Filter = string.Format("(member={0})", givenUser); 
dsLookFor1.SearchScope = SearchScope.Subtree; 
dsLookFor1.PropertiesToLoad.Add("distinguishedName"); 

SearchResultCollection belongToGroups = dsLookFor1.FindAll(); 
foreach (SearchResult srGroupBelongTo in belongToGroups) 
{ 
    Console.WriteLine("{0}", srGroupBelongTo.Properties["distinguishedName"][0]); 

    /* Search for all groups managed by a group 
    */ 
    DirectorySearcher dsLookFor2 = new DirectorySearcher(deBase); 
    dsLookFor2.Filter = string.Format("(&(objectClass=group)(managedBy={0}))", srGroupBelongTo.Properties["distinguishedName"][0]); 
    dsLookFor2.SearchScope = SearchScope.Subtree; 
    dsLookFor2.PropertiesToLoad.Add("distinguishedName"); 

    SearchResultCollection managedByGroups = dsLookFor2.FindAll(); 
    foreach (SearchResult srGroupManagedBy in managedByGroups) 
    { 
    Console.WriteLine("\t{0}", srGroupManagedBy.Properties["distinguishedName"][0]); 
    } 
} 
相关问题