2010-05-11 5 views
2

Actuellement, je voudrais trouver tous les groupes dans l'Active Directory où l'utilisateur actuel a le droit WriteProperty. Le problème est que je peux trouver tous les groupes où l'utilisateur est directement inséré, mais quand l'utilisateur est dans un groupe et que ce groupe a un accès en écriture, il n'apparaîtra pas. Je pensais que la définition des booléens de GetAccessRules() aiderait ici, mais ce n'est pas le cas.Comment trouver tous les groupes dans ActiveDirectory où l'utilisateur actuel a l'accès WriteProperty?

Voici le code que je l'ai déjà:

var identity = WindowsIdentity.GetCurrent().User; 
var allDomains = Forest.GetCurrentForest().Domains.Cast<Domain>(); 

var allSearcher = allDomains.Select(domain => 
    { 
     var searcher = new DirectorySearcher(new DirectoryEntry("LDAP://" + domain.Name)); 
     //Apply some filter to focus on only some specfic objects 
     searcher.Filter = "(&(objectClass=group)(name=*part_of_group_name*))"; 
     return searcher; 
    }); 

var itemsFound = allSearcher 
    .SelectMany(searcher => searcher.FindAll() 
     .Cast<SearchResult>() 
     .Select(result => result.GetDirectoryEntry())); 

var itemsWithWriteAccess = itemsFound 
    .Where(entry => entry.ObjectSecurity.GetAccessRules(true, true, typeof(SecurityIdentifier)) 
     .Cast<ActiveDirectoryAccessRule>() 
     .Where(rule => rule.IdentityReference == identity) 
     .Where(rule => (rule.ActiveDirectoryRights & ActiveDirectoryRights.WriteProperty) == ActiveDirectoryRights.WriteProperty) 
     .Count() > 0); 

foreach (var item in itemsWithWriteAccess) 
{ 
    Debug.Print(item.Name); 
} 

Répondre

1

Après une longue période et l'aide de Harvey par this question j'ai finalement trouvé une bonne solution de travail.

Comme déjà expliqué par Harvey, il peut être un peu difficile de vraiment comprendre ce que vous obtiendrez dans entry.Properties["allowedAttributesEffective"].Value. Mais à des fins normales tout ce que vous devez vérifier pour une autorisation d'écriture est que ce champ est simplement non nul.

Voici l'exemple de code:

// (replace "part_of_group_name" with some partial group name existing in your AD) 
var groupNameContains = "part_of_group_name"; 

var identity = WindowsIdentity.GetCurrent().User; 
var allDomains = Forest.GetCurrentForest().Domains.Cast<Domain>(); 

var allSearcher = allDomains.Select(domain => 
{ 
    var searcher = new DirectorySearcher(new DirectoryEntry("LDAP://" + domain.Name)); 

    // Apply some filter to focus on only some specfic objects 
    searcher.Filter = String.Format("(&(objectClass=group)(name=*{0}*))", groupNameContains); 
    return searcher; 
}); 

var directoryEntriesFound = allSearcher 
    .SelectMany(searcher => searcher.FindAll() 
     .Cast<SearchResult>() 
     .Select(result => result.GetDirectoryEntry())); 

var allowedTo = directoryEntriesFound.Select(entry => 
    { 
     using (entry) 
     { 
      entry.RefreshCache(new string[] { "allowedAttributesEffective" }); 
      var rights = entry.Properties["allowedAttributesEffective"].Value == null ? "read only" : "write"; 
      return new { Name = entry.Name, AllowedTo = rights }; 
     } 
    }); 

foreach (var item in allowedTo) 
{ 
    var message = String.Format("Name = {0}, AllowedTo = {1}", item.Name, item.AllowedTo); 
    Debug.Print(message); 
} 
Questions connexes