2011-12-07 10 views
-1

DirectoryServiceとLDAPをクエリして、ユーザーが属するグループ名を取得する グループ「Test100」内にあり、このグループ「Test100」が別のグループ「Test」内にあるとします。 LDAPサーバーに照会するときこの問題を解決するためにどのようにそれがTest100の内側にあると私はTest100ディレクトリサービスLDAPを使用するすべてのグループをどのように取得するのですか?

の内側にしていますので、「テスト」この作品、LDAPプロバイダとしてActive Directoryを使用し

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

これは正常に動作し、メイングループを返すコードが追加されました.. たとえば、自分の名前でクエリを実行し、TestとTestに属していれば、別のグループTest01内にあります。次に、Testで返されません。 – SSK

答えて

0

を助けてください..返さ取得されていません(少なくとも、小規模で - 大きなディレクトリではテストしていません):

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

    } 
} 

NB。

  1. これは、各ユーザーの属性の一部ではなく、ADに暗黙的にハードコードされた「ドメインユーザー」を検出しません。
  2. 再帰を避けるためにQueueを使用する。
  3. 同じグループを再度処理することを避けるためにHashSetを使用すると、AがBに属し、BがAに属していれば、無限ループにつながります。
関連する問題