所属しているすべてのグループを表示する画面の Windows アプリの C# のコードです。
//プライベートフィールド
private readonly DomainObject member; //メンバー
private readonly Dictionary<string, DomainGroup> allGroups; //全グループ(Key:distinguishedName)
private readonly List<string> addedDisplayNames; //リストに追加したグループの表示テキスト
//パブリックコンストラクター
public InRoleGroupList(DomainObject member)
{
InitializeComponent();
this.member = member;
allGroups = DirectoryAccess.GetGroups<DomainGroup>().ToDictionary(
group => group.Entry.Properties["distinguishedName"].Value.ToString(), group => group);
addedDisplayNames = new List<string>();
this.AddChildNode(); //子ノードを追加
this.GroupListBox.DataSource = addedDisplayNames;
this.ViewPanel.Enabled = addedDisplayNames.Count > 1;
this.GroupTreeView.ExpandAll();
}
//イベントハンドラ
//TreeRadioButton, ListRadioButton
private void RadioButton_CheckedChanged(object sender, EventArgs e)
{
this.GroupTreeView.Visible = sender == this.TreeRadioButton;
this.GroupListBox.Visible = !this.GroupTreeView.Visible;
}
//プライベートメソッド
//子ノードを追加
private void AddChildNode()
{
var imageIndex = (int)member.Category;
var node = new TreeNode(member.ToString(), imageIndex, imageIndex);
this.GroupTreeView.Nodes.Add(node);
if ((member.Category == CategoryType.User) || (member.Category == CategoryType.Computer))
{
//プライマリー グループを追加
var primaryGroupId = (member.Category == CategoryType.User) ?
((DomainUser)member).PrimaryGroupId : ((Computer)member).PrimaryGroupId;
var group = allGroups.Values.Cast<DomainGroup>().Single(grp => grp.Token == primaryGroupId);
this.AddChildNode(node, group); //子ノードを追加
}
//所属するグループを追加
foreach (string memberOf in member.Entry.Properties["memberOf"])
{
this.AddChildNode(node, allGroups[memberOf]); //子ノードを追加
}
}
//子ノードを追加
private void AddChildNode(TreeNode node, DomainGroup group)
{
var childNode = CreateNode(group); //ノードを作成
node.Nodes.Add(childNode);
if (addedDisplayNames.Contains(childNode.Text) == false)
{
addedDisplayNames.Add(childNode.Text); //表示するテキストを追加
}
//ネストしているグループを追加
foreach (string memberOf in group.Entry.Properties["memberOf"])
{
this.AddChildNode(childNode, allGroups[memberOf]); //子ノードを追加
}
}
//指定したグループのノードを作成
private TreeNode CreateNode(DomainGroup group)
{
var displayName = String.Format("{0}({1})", group.Name, group.Scope); //表示するテキスト
var fontColor = Color.Black;
switch (group.ScopeType)
{
case DomainGroupScopeType.DomainLocal:
fontColor = Color.Blue;
break;
case DomainGroupScopeType.Global:
fontColor = Color.Green;
break;
case DomainGroupScopeType.Universal:
fontColor = Color.Brown;
break;
}
return new TreeNode(displayName) { Name = group.Name, ForeColor = fontColor };
}
Dispose メソッドに次のコードを追加しました。
DirectoryAccess.DisposeItems(allGroups.Values);
内容の説明は VB の方に書いてますのでそちらをご覧ください。
Active Directory 関連 Blog
http://www.pbyk.com/blog/bloglist.html