2010-05-25 15 views
5

Şu anki OU'ların bir listesini Active Directory'den alabiliyorum. Bazı örnek kodları bir süredir çevrimiçi olarak inceledim, fakat O bunu işe yaramayacak gibi görünmüyor. // RootDSE Herhangi Fikirler:AD OU listesinin alınması

 string defaultNamingContext; 

     DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE"); 
     defaultNamingContext = rootDSE.Properties["defaultNamingContext"].Value.ToString(); 
     DirectorySearcher ouSearch = new DirectorySearcher(rootDSE, "(objectClass=organizationalUnit)", 
      null, SearchScope.Subtree); 

     MessageBox.Show(rootDSE.ToString()); 
     try 
     { 
      SearchResultCollection collectedResult = ouSearch.FindAll(); 
      foreach (SearchResult temp in collectedResult) 
      { 
       comboBox1.Items.Add(temp.Properties["name"][0]); 
       DirectoryEntry ou = temp.GetDirectoryEntry(); 
      } 

alıyorum hata sağlayıcı desteklemekte ve LDAP arama yapamazsınız Orada gelmez mi? Bu döndürülen arama sonuçlarının her biri için , onları bir açılan kutuya eklemek istiyorum. (çok zor olmamalı)

cevap

10

LDAP://RootDSE seviyesinde arama yapamazsınız - bu sadece bazı şeyler içeren bir "bilgilendirme" adresidir. Dizininizdeki herhangi bir konumu gerçekten temsil etmez. Önce varsayılan adlandırma bağlamı bağlamak gerekir: Bunu yaptığınızda

string defaultNamingContext; 

DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE"); 
defaultNamingContext = rootDSE.Properties["defaultNamingContext"].Value.ToString(); 

DirectoryEntry default = new DirectoryEntry("LDAP://" + defaultNamingContext); 

DirectorySearcher ouSearch = new DirectorySearcher(default, 
            "(objectClass=organizationalUnit)", 
            null, SearchScope.Subtree); 

, kendi etki alanındaki tüm OU adlı bulmak için OK olmalıdır.

Ve hızlandırmak amacıyla

, ben objectClass kullanarak arama değil öneriyoruz - özellik MS endeksli değil olduğunu. endeksli olduğu, bunun yerine objectCategory kullanın:

DirectorySearcher ouSearch = new DirectorySearcher(default, 
            "(objectCategory=Organizational-Unit)", 
            null, SearchScope.Subtree); 

GÜNCELLEME: Ben bu filtreyi keşfetti
yanlıştır - objectCategoryADSI browser içinde CN=Organizational-Unit,..... olarak gösterilmekle birlikte, bunun için arama objectCategory=organizationalUnit belirtmeniz gerekir başarılı olmak için:

DirectorySearcher ouSearch = new DirectorySearcher(default, 
            "(objectCategory=organizationalUnit)", 
            null, SearchScope.Subtree); 
+0

Yukarıdaki önerilerinizi kullanarak arama yapmayı denedim, gerçekten iyi bir fikir gibi görünüyor, ancak onu uygulamaya çalışan bir noob var. Ben varsayılan bir sorun olduğunu göremedim 'etki alanı', değişti, benim sorun bu etki alanı = System.DirectoryServices.DirectoryEntry, yerine LDAP: // ... onun yolu özelliği. –

+2

Sadece bunu daha sonra bulanları ekleyeceğimi düşündüm. Server 2003 R2 ve daha önceki sürümlerde * değil * index 'objectClass', ancak 2008 ve sonrası yapılır. Cevaplara aykırı değil! Sadece yeni bilgi. Kaynak: http://msdn.microsoft.com/en-us/library/ms675095(v=vs.85).aspx – klyd