所属しているすべてのグループを表示する画面の 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