所属しているすべてのグループを表示する画面の Web アプリの VB のコードです。
 'プライベートフィールド
 Private member As DomainObject  'メンバー
 Private allGroups As Dictionary(Of String, DomainGroup)   '全グループ(Key:distinguishedName)
 Private addedDistinguishedNames As List(Of String)  'ノードに追加したグループの識別名
  
 'イベントハンドラ
 Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
   Dim name = Request.QueryString("name")  '名前
   If String.IsNullOrEmpty(name) Then
     Return
   End If
  
   Dim category As CategoryType  'Directory オブジェクトの種類
   If [Enum].TryParse(Of CategoryType)(Request.QueryString("category"), category) = False Then
     Return
   End If
   If Me.IsPostBack Then
     Return
   End If
  
   Select Case category  'Directory オブジェクトの種類
     Case CategoryType.User
       member = DomainUser.FindByName(name)  'ユーザーを検索
     Case CategoryType.Group
       member = DomainGroup.FindByName(name) 'グループを検索
     Case CategoryType.Computer
       member = Computer.FindByName(name)    'コンピューターを検索
   End Select
   If member Is Nothing Then
     Return
   End If
  
   allGroups = DirectoryAccess.GetGroups(Of DomainGroup)().ToDictionary(
     Function(group) group.Entry.Properties.Item("distinguishedName").Value.ToString(), Function(group) group)
   addedDistinguishedNames = New List(Of String)()
   Me.AddChildNode()   '子ノードを追加
   Me.GroupListBox.DataSource = CreateGroupTable()   'データソース用のテーブルを作成
   Me.GroupListBox.DataTextField = "Text"
   Me.GroupListBox.DataValueField = "Value"
   If addedDistinguishedNames.Count > 1 Then
     Me.GroupListBox.Style.Add(HtmlTextWriterStyle.BorderStyle, "None")
   Else
     Me.ViewRadioButtonList.Enabled = False
   End If
   Me.GroupListBox.DataBind()
   member.Dispose()
   DirectoryAccess.DisposeItems(allGroups.Values)
 End Sub
  
 Protected Sub ViewRadioButtonList_SelectedIndexChanged(
   sender As Object, e As EventArgs) Handles ViewRadioButtonList.SelectedIndexChanged
   Me.GroupTreeView.Visible = (Me.ViewRadioButtonList.SelectedIndex = 0)
   Me.GroupListBox.Visible = Not Me.GroupTreeView.Visible
 End Sub
  
 'プライベートメソッド
 '子ノードを追加
 Private Sub AddChildNode()
   Dim node As New TreeNode(member.ToString(), member.Name)
   Me.GroupTreeView.Nodes.Add(node)
   If (member.Category = CategoryType.User) OrElse (member.Category = CategoryType.Computer) Then
     'プライマリー グループを追加
     Dim primaryGroupId = If(member.Category = CategoryType.User,
       DirectCast(member, DomainUser).PrimaryGroupId, DirectCast(member, Computer).PrimaryGroupId)
     Dim group = allGroups.Values.Cast(Of DomainGroup)().Single(Function(grp) grp.Token = primaryGroupId)
     Me.AddChildNode(node, group)  '子ノードを追加
   End If
   '所属するグループを追加
   For Each memberOf As String In member.Entry.Properties.Item("memberOf")
     Me.AddChildNode(node, allGroups.Item(memberOf))   '子ノードを追加
   Next
 End Sub
  
 '子ノードを追加
 Private Sub AddChildNode(node As TreeNode, group As DomainGroup)
   Dim displayName = String.Format("{0}({1})", group.Name, group.Scope)  '表示するテキスト
   Dim distinguishedName = group.Entry.Properties.Item("distinguishedName").Value.ToString()   '識別名
   Dim childNode As New TreeNode(displayName, group.Name)  'ノードを作成
   node.ChildNodes.Add(childNode)
   If addedDistinguishedNames.Contains(distinguishedName) = False Then
     addedDistinguishedNames.Add(distinguishedName)  '識別名を追加
   End If
   'ネストしているグループを追加
   For Each memberOf As String In group.Entry.Properties.Item("memberOf")
     Me.AddChildNode(childNode, allGroups.Item(memberOf))  '子ノードを追加
   Next
 End Sub
  
 'データソース用のテーブルを作成
 Private Function CreateGroupTable() As DataTable
   Dim table As New DataTable()
   table.Columns.Add(New DataColumn("Value", GetType(String)))   '値(distinguishedName)
   table.Columns.Add(New DataColumn("Text", GetType(String)))    '表示するテキスト
   For Each distinguishedName In addedDistinguishedNames   'ノードに追加したグループ数分
     Dim row = table.NewRow()
     Dim group = allGroups.Item(distinguishedName)
     Dim displayName = String.Format("{0}({1})", group.Name, group.Scope)
     row.Item(0) = distinguishedName
     row.Item(1) = displayName
     table.Rows.Add(row)
   Next
   Return table
 End Function
  
 内容的には Windows アプリと同じです。
 メンバー(対象のオブジェクト)の情報は Page.Load イベントで、クエリ文字列から name(名前)と category(Directory オブジェクトの種類)を取得してます。
 で、Directory オブジェクトの種類ごとにそのクラスの FindByName メソッドを呼び出してオブジェクトを取得してます。
 FindByName メソッドはユーザー、グループ、コンピューターの各リスト画面の詳細表示用 FormView のデータソースになってる ObjectDataSource の SelectMethod に指定されてるメソッドです。
 実装コードはこちら(ユーザー、グループ、コンピューター)
  
 ListBox のデータソースには DataTable をセットしてます。
  
  
 Active Directory 関連 Blog  
http://www.pbyk.com/blog/bloglist.html