Quantcast
Channel: わんくま同盟
Viewing all articles
Browse latest Browse all 994

所属しているすべてのグループを表示する画面のWindowsアプリのコード(C#)

$
0
0

所属しているすべてのグループを表示する画面の Windows アプリの C# のコードです。

//プライベートフィールド

private readonlyDomainObject member;   //メンバー

private readonlyDictionary<string, DomainGroup> allGroups;   //全グループ(Key:distinguishedName)

private readonlyList<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 = newList<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 = newTreeNode(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]);  //子ノードを追加

  }

}

 

//指定したグループのノードを作成

privateTreeNode CreateNode(DomainGroup group)

{

  var displayName = String.Format("{0}({1})", group.Name, group.Scope);   //表示するテキスト

  var fontColor = Color.Black;

  switch (group.ScopeType)

  {

    caseDomainGroupScopeType.DomainLocal:

      fontColor = Color.Blue;

      break;

    caseDomainGroupScopeType.Global:

      fontColor = Color.Green;

      break;

    caseDomainGroupScopeType.Universal:

      fontColor = Color.Brown;

      break;

  }

  return newTreeNode(displayName) { Name = group.Name, ForeColor = fontColor };

}

 

Dispose メソッドに次のコードを追加しました。

DirectoryAccess.DisposeItems(allGroups.Values);

 

内容の説明は VB の方に書いてますのでそちらをご覧ください。

 

 

Active Directory 関連 Blog

http://www.pbyk.com/blog/bloglist.html


Viewing all articles
Browse latest Browse all 994

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>