グループのネストしているすべてのメンバーを表示する画面の Web アプリの VB のコードです。
'イベントハンドラ
Protected Sub Page_Load(ByVal sender As Object, ByVal e AsEventArgs) 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 NewTreeNode(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 AsTreeNode, member AsDomainObject)
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 AsDomainObject) AsTreeNode
Dim displayName AsString '表示するテキスト
Select Case member.Category
CaseCategoryType.User
Dim user = DirectCast(member, DomainUser)
displayName = String.Format("{0}({1}{2}:{3}/{4})",
user, user.LastName, user.FirstName, user.DisplayPath, user.Name)
CaseCategoryType.Group
Dim group = DirectCast(member, DomainGroup)
displayName = String.Format("{0}({1}:{2})", group, group.Scope, group.DisplayPath)
CaseCategoryType.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 NewTreeNode(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