2011-12-07 73 views
-1

我使用DirectoryService和查詢LDAP來獲取用戶所屬的組名 假設我在一個組「Test100」內,並且這個組「Test100」在另一個組裏面說「測試」 當我查詢LDAP服務器時「測試」是沒有得到恢復,因爲它是內部Test100,我裏面Test100如何使用目錄服務LDAP獲取用戶所屬的所有組?

如何來解決這個問題..請幫助

Dim LDAPpath As String = <LDAP String> 
     entry = New DirectoryEntry(LDAPpath, <App ID>, <Password>) 
     Dim search As New DirectorySearcher(entry) 

     search.PropertiesToLoad.Add([property]) 
     search.Filter = "sAMAccountName=" & FilterOutDomain(userName) 

     Dim result As SearchResult = search.FindOne() 




     Return result 
+0

你目前正在嘗試什麼(代碼)?此外,這是否需要遞歸 - 包括其他組的成員身份? – Richard

+0

添加了代碼這工作正常,並返回主組.. 例如,如果我查詢與我的名字,如果我屬於測試和測試是在另一組Test01 ..然後我不返回與測試 – SSK

回答

0

使用Active Directory作爲LDAP提供,這個工程(至少小規模 - 我還沒有測試過大目錄):

class Program { 
    HashSet<string> foundGroups = new HashSet<string>(); 
    Queue<string> toProcess = new Queue<string>(); 

    void Run(string startingPoint) { 

     ExpandMembership(startingPoint); 

     while (toProcess.Count > 0) { 
      var name = toProcess.Dequeue(); 
      if (foundGroups.Contains(name)) { 
       // Have already handled this group 
       continue; 
      } 

      foundGroups.Add(name); 
      ExpandMembership(name); 
     } 

     Console.WriteLine("Found {0} groups:", foundGroups.Count); 
     foreach (var group in foundGroups.OrderBy(s => s)) { 
      Console.WriteLine(group); 
     } 
    } 

    private void ExpandMembership(string name) { 
     var entry = new DirectoryEntry("LDAP://" + name); 
     var memberOf = entry.Properties["memberOf"]; 
     foreach (string groupName in memberOf) { 
      toProcess.Enqueue(groupName); 
     } 
    } 

    static void Main(string[] args) { 
     var userPath = "CN=User Name,CN=Users,DC=ad,DC=example,DC=net"; 
     var p = new Program(); 
     p.Run(userPath); 

    } 
} 

注意:

  1. 這將不包括「域用戶」,其成員的是隱含的,硬編碼到AD,而不是每個用戶的屬性的一部分。
  2. 使用Queue來避免遞歸。
  3. 使用HashSet來避免再次處理同一組,否則如果A屬於B並且B屬於A將導致無限循環。
相關問題