グループのネストしているすべてのメンバーを表示する画面の Web アプリの C# のコードです。
//イベントハンドラ
protected void Page_Load(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(Request.QueryString["name"]))
{
return;
}
if (this.IsPostBack)
{
return;
}
this.AddChildNode(); //子ノードを追加
}
//プライベートメソッド
//子ノードを追加
private void AddChildNode()
{
using (var group = DomainGroup.FindByName(Request.QueryString["name"])) //グループを検索
{
var node = new TreeNode(group.Name);
this.MemberTreeView.Nodes.Add(node);
var members = DirectoryAccess.GetMembers(group); //グループのメンバーを取得
foreach (var member in members)
{
this.AddChildNode(node, member); //子ノードを追加
member.Dispose();
}
}
}
//子ノードを追加
private void AddChildNode(TreeNode node, DomainObject member)
{
var childNode = CreateNode(member); //ノードを作成
node.ChildNodes.Add(childNode);
if (member.Category == CategoryType.Group)
{
var subMembers = DirectoryAccess.GetMembers((DomainGroup)member); //グループのメンバーを取得
foreach (var subMember in subMembers)
{
this.AddChildNode(childNode, subMember); //子ノードを追加
subMember.Dispose();
}
}
}
//指定したメンバーのノードを作成
private TreeNode CreateNode(DomainObject member)
{
string displayName; //表示するテキスト
switch (member.Category)
{
case CategoryType.User:
var user = (DomainUser)member;
displayName = String.Format("{0}({1}{2}:{3}/{4})",
user, user.LastName, user.FirstName, user.DisplayPath, user.Name);
break;
case CategoryType.Group:
var group = (DomainGroup)member;
displayName = String.Format("{0}({1}:{2})", group, group.Scope, group.DisplayPath);
break;
case CategoryType.Computer:
var pc = (Computer)member;
string sp = null;
if (pc.OperatingSystemServicePack != null)
{
sp = pc.OperatingSystemServicePack.Replace("Service Pack ", " SP");
}
displayName = String.Format("{0}({1}{2}:{3})", pc, pc.OperatingSystem, sp, pc.Role);
break;
default: //CategoryType.ForeignSecurityPrincipal
displayName = String.Format("{0}({1})", member, member.Name);
break;
}
return new TreeNode(displayName, member.Name);
}
内容的には Windows アプリと同じです。説明は VB の方に書いてますのでそちらをご覧ください。
Active Directory 関連 Blog
http://www.pbyk.com/blog/bloglist.html