2012-08-21 22 views
10

Özel bir çok değerli özellik aldık. Mevcut grubu yöneten kullanıcıları veya grupları (DN'lerini) içerebilen ourOwnManagedBy diyelim.Bir kullanıcının yönetdiği tüm grupları bulma

Belirli bir kullanıcının yönettiği tüm grupların bir listesini (managedBy ve ourOwnManagedBy yardımıyla) nasıl alabilirim? Örneğin,

. Kullanıcının GlobalAdministrators grubunun üyesi olduğunu ve ApplicationAdministrators grubunun GlobalAdministrations üyesi olduğunu varsayalım. Son olarak, ourOwnManagedBy özniteliğinde ApplicationAdministrators içeren MyApplication grubu.

  • UserGlobalAdministrators
  • GlobalAdministrators üyesi
  • MyApplicationApplicationAdministrators üyesi ben bilgilerinin belirli bir kullanıcının yönettiği tüm grupları bulmak için nasıl kullanırım

ourOwnManagedBy yılında ApplicationAdministrators var olan nedir? Özel niteliklerde (kullanıcıların ve grupların DN'lerini içeren) bir tür özyinelelik denetimi yapmak mümkün mü?

Güncelleme

Böyle bir dizin arama filtresi kullanmayı denedik:

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

ama olabilir missunderstood Ne 1.2.840.113556.1.4.1941 yapar? (MSDN page)

+0

Bu aptal, ancak bağlantılı sitede kod örneği DN'yi parantez içine alır. Aynı şeyi denedin mi? Bir fark yaratmasını beklemezdim, ama denemedim. – JDB

+0

evet, denedim. Ama öneri için teşekkürler – jgauffin

cevap

1

Sadece bir LDAP sorgusuyla başa çıkmak mümkün değil. Bunu alt sorgulara bölmeniz ve her birini ayrı ayrı çalıştırmanız gerekir; bu da yinelenecek çok şey varsa, etki alanı denetleyicisini tıkar.

Bunu anlattığım şekilde yapmaya çalıştım ve performans korkunçtu, en azından .NET için kullanılabilir modülleri kullanıyordum.

+0

Daha iyi görünmüyor :( – jgauffin

0

Aşağıdaki sayfa, kullandığınız LDAP_MATCHING_RULE_TRANSITIVE_EVAL uygulamasının Windows 2008 ve daha yüksek sürümlerinde çalıştığını söyleyen 3.1.1.3.4.4 LDAP Matching Rules (extensibleMatch) diyor. 2003 kullanıyorsanız, çalışmayabilir.

+0

Bu benim soruma nasıl cevap veriyor? – jgauffin

+0

Hangi işletim sistemini kullandığınızdan bahsetmediniz. Windows 2003 hata vermeyecek, sadece herhangi bir sonuç döndürmeyecek. – Roland

+0

Sunucu 2008R2 – jgauffin

0

Özyineleme yok, performans bilgisinin nasıl yapılacağı hakkında bir fikir yok, hatalar olabilir.

 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(); 
     } 

dürüst olmak ve bu aslında benim için çalışmıyor demek :) Ama bunun nedeni bizim alanı yapılandırıldığı şekilde olduğunu düşüneceğim. Eğer başka bir şey olmasa bile sizi doğru yönlendirmeye itecektir.

+0

Dev bir arama dizesi çalışmıyor. Bunu denedim. – jgauffin

+0

@jgauffin - Neden çalışmıyor? – Peter

+0

Bir AD hatası alıyorum. uzunluk sınırı? – jgauffin

İlgili konular