グループのネストしているすべてのメンバーを表示する画面の Web アプリの VB のコードです。
'イベントハンドラ
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
If String.IsNullOrEmpty(Request.QueryString("name")) Then
Return
End If
If Me.IsPostBack Then
Return
End If
Me.AddChildNode() '子ノードを追加
End Sub
'プライベートメソッド
'子ノードを追加
Private Sub AddChildNode()
Using group = DomainGroup.FindByName(Request.QueryString("name")) 'グループを検索
Dim node As New TreeNode(group.Name)
Me.MemberTreeView.Nodes.Add(node)
Dim members = DirectoryAccess.GetMembers(group) 'グループのメンバーを取得
For Each member In members
Me.AddChildNode(node, member) '子ノードを追加
member.Dispose()
Next
End Using
End Sub
'子ノードを追加
Private Sub AddChildNode(node As TreeNode, member As DomainObject)
Dim childNode = CreateNode(member) 'ノードを作成
node.ChildNodes.Add(childNode)
If member.Category = CategoryType.Group Then
Dim subMembers = DirectoryAccess.GetMembers(DirectCast(member, DomainGroup)) 'グループのメンバーを取得
For Each subMember In subMembers
Me.AddChildNode(childNode, subMember) '子ノードを追加
subMember.Dispose()
Next
End If
End Sub
'指定したメンバーのノードを作成
Private Function CreateNode(member As DomainObject) As TreeNode
Dim displayName As String '表示するテキスト
Select Case member.Category
Case CategoryType.User
Dim user = DirectCast(member, DomainUser)
displayName = String.Format("{0}({1}{2}:{3}/{4})",
user, user.LastName, user.FirstName, user.DisplayPath, user.Name)
Case CategoryType.Group
Dim group = DirectCast(member, DomainGroup)
displayName = String.Format("{0}({1}:{2})", group, group.Scope, group.DisplayPath)
Case CategoryType.Computer
Dim pc = DirectCast(member, Computer)
Dim sp As String = Nothing
If pc.OperatingSystemServicePack IsNot Nothing Then
sp = pc.OperatingSystemServicePack.Replace("Service Pack ", " SP")
End If
displayName = String.Format("{0}({1}{2}:{3})", pc, pc.OperatingSystem, sp, pc.Role)
Case Else 'CategoryType.ForeignSecurityPrincipal
displayName = String.Format("{0}({1})", member, member.Name)
End Select
Return New TreeNode(displayName, member.Name)
End Function
内容的には Windows アプリと同じです。
対象のグループの情報は AddChildNode メソッドでクエリ文字列から name(名前)を取得して DomainGroup.FindByName メソッドを呼び出して取得してます。
DomainGroup.FindByName メソッドはグループリスト画面の詳細表示用 FormView のデータソースになってる ObjectDataSource の SelectMethod に指定されてるメソッドです。
※実装コードはこちら
Active Directory 関連 Blog
http://www.pbyk.com/blog/bloglist.html