2012-08-21 21 views
10

Otrzymaliśmy specjalny atrybut wielowartościowy. Nazwijmy go ourOwnManagedBy, który może zawierać użytkowników lub grupy (ich DN), które zarządzają bieżącą grupą.Znajdowanie wszystkich grup, którymi zarządza użytkownik

Jak mogę pobrać listę wszystkich grup zarządzanych przez określonego użytkownika (przy pomocy managedBy i ourOwnManagedBy)?

Na przykład. Załóżmy, że użytkownik jest członkiem grupy GlobalAdministrators i że grupa ApplicationAdministrators ma członkostwo GlobalAdministrations. I na koniec grupa MyApplication, która ma ApplicationAdministratorów w atrybucie ourOwnManagedBy.

  • User jest członkiem GlobalAdministrators
  • GlobalAdministrators jest członkiem ApplicationAdministrators
  • MyApplication dostał ApplicationAdministrators w ourOwnManagedBy

Jak używać tych informacji w celu znalezienia wszystkich grup, które określony użytkownik zarządza? Czy możliwe jest przeprowadzenie rekurencyjnego sprawdzania atrybutów niestandardowych (zawierających nazwy DN użytkowników i grup)?

Aktualizacja

Próbowałem użyć filtru wyszukiwania katalogów tak:

string.Format("(ourOwnManagedBy:1.2.840.113556.1.4.1941:={0})", dn); 

ale może mam missunderstood co 1.2.840.113556.1.4.1941 robi? (MSDN page)

+0

To jest głupie, ale przykład kodu na połączonej stronie zamyka jej DN w nawiasach klamrowych. Czy próbowałeś tego samego? Nie spodziewałbym się, że to coś zmieni, ale tego nie próbowałem. – JDB

+0

Tak, wypróbowałem to. Ale dzięki za sugestię – jgauffin

Odpowiedz

1

Jest to, obawiam się, niemożliwe do osiągnięcia przy użyciu tylko jednego zapytania LDAP. Będziesz musiał podzielić go na podzapytania i uruchomić je oddzielnie, co z kolei spowoduje dławienie kontrolera domeny, jeśli jest dużo do iteracji.

Próbowałem zrobić to tak, jak opisałem, a występ był okropny, przynajmniej robiąc to przy użyciu dostępnych modułów dla .NET.

+0

Nie wydaje się być lepszy :( – jgauffin

0

Na poniższej stronie podano, że 3.1.1.3.4.4 LDAP Matching Rules (extensibleMatch) mówi, że używana wartość LDAP_MATCHING_RULE_TRANSITIVE_EVAL działa w systemie Windows 2008 i wersjach wyższych. Jeśli używasz 2003, może nie działać.

+0

Jak to odpowiada na moje pytanie? – jgauffin

+0

Nie wspomniano, którego systemu operacyjnego używasz. Windows 2003 nie będzie generował błędów, nie zwróci żadnych wyników. – Roland

+0

Serwer jest 2008R2 – jgauffin

0

Brak rekursji, brak informacji na temat tego, w jaki sposób będzie działał pod kątem wydajności, może zawierać błędy.

 string user = "username"; 
     //get domain 
     DirectoryEntry de = System.DirectoryServices.ActiveDirectory.Domain.GetCurrentDomain().GetDirectoryEntry(); 
     //get users dn first 
     string userDN; 
     using (var searcher = new DirectorySearcher(de)) 
     { 
      searcher.Filter = String.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0}))", user); 
      searcher.PropertiesToLoad.Add("distinguishedName"); 
      userDN = searcher.FindOne().Properties["distinguishedName"][0].ToString(); 
     } 

     //get list of all users groups 
     List<string> groups; 
     //see http://stackoverflow.com/questions/6252819/find-recursive-group-membership-active-directory-using-c-sharp 
     using (var searcher2 = new DirectorySearcher(de)) 
     { 
      searcher2.Filter = String.Format("(member:1.2.840.113556.1.4.1941:={0})", userDN); 
      searcher2.SearchScope = SearchScope.Subtree; 
      searcher2.PropertiesToLoad.Add("distinguishedName"); 

      SearchResultCollection src = searcher2.FindAll(); 

      groups = (from SearchResult c in src 
         select c.Properties["distinguishedName"][0].ToString()).ToList(); 
     } 

     //build giant search query 
     SearchResultCollection srcGroups; 
     using (var searcher = new DirectorySearcher(de)) 
     { 
      string baseString = "(|{0})"; 
      string managedbybase = "(managedBy={0})"; 
      //I've read that you can search multivalued lists using a standard ='s. 
      string ourOwnManagedByBase = "(ourOwnManagedBy={0})"; 

      StringBuilder sb = new StringBuilder(); 

      //add user DN to list of group dn's 
      groups.Add(userDN); 

      foreach (string g in groups) 
      { 
       sb.AppendFormat(managedbybase, g); 
       sb.AppendFormat(ourOwnManagedByBase, g); 
      } 

      searcher.Filter = string.Format(baseString, sb.ToString()); 
      srcGroups = searcher.FindAll(); 
     } 

Będę szczery i powiem, że to faktycznie nie działa dla mnie :) Ale myślę, że to ze względu na sposób nasza domena jest skonfigurowana. Jeśli nic więcej nie może to popchnie cię w odpowiednim kierunku.

+0

Wielki ciąg wyszukiwania nie działa, próbowałem tego .. – jgauffin

+0

@jgauffin - Dlaczego to nie działa? – Peter

+0

Otrzymuję błąd AD. Może to być filtr limit długości? – jgauffin

Powiązane problemy