クラスライブラリ側に続いてアプリケーション側。どのリスト画面も基本的には次の設定・処理をしてます。
・BindingSource コンポーネントのデータソースに クラスライブラリ側のクラスを設定
・TextBox、Label、CheckBox のコントロールのプロパティに クラスのプロパティ(単一値)をバインド
・表示に必要なオブジェクトのリストを取得、フォームやコントロールを初期設定
・ListBox、ListView の Items プロパティに コードから項目を追加
・複数値をもつ クラスのプロパティはコードから設定
・一覧の ListBox.SelectedIndexChanged イベントハンドラの実装
・デザイナのファイルの Dispose メソッド内に オブジェクトのリストを解放するコードを追記
メイン画面はこんな感じ。(左がドメインにログオンした時ので右がローカルログオンした時の)
「ドメイン関連情報」ボタンはドメイン情報の表示を行うものです。
ユーザのリストはローカル用も考慮して実装します。
まずはデザイン画面。(クリックすると新しいウィンドウで拡大図が表示されます。)
※ローカルユーザ用のコントロールは後ろに隠れてます。
実行時の画面。左がドメインログオン時で右がローカルログオン時。(クリックすると新しいウィンドウで拡大図が表示されます。)
実装はこんな感じ。
プライベートフィールド
Private ReadOnly users As IEnumerable(Of IUser) 'ユーザのリスト
Private ReadOnly groups As IEnumerable(Of IGroup) 'グループのリスト
Private ReadOnly groupListBox As ListBox
Private ReadOnly userBindingSource As BindingSource コンストラクタ
Public Sub New()
' この呼び出しはデザイナーで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します。
users = DirectoryAccess.GetUsers() 'ユーザのリストを取得
groups = DirectoryAccess.GetGroups() 'グループのリストを取得
If DirectoryAccess.IsLogonDomain Then 'ドメインにログオンしている時
Dim domainUsers As New List(Of DomainUser)()
For Each user As DomainUser In users
domainUsers.Add(user)
Next
userBindingSource = Me.DomainUserBindingSource
userBindingSource.DataSource = domainUsers
groupListBox = Me.lbox_groupdomain
Me.pnl_local.Visible = False
Else 'ドメインにログオンしていない時
Dim localUsers As New List(Of LocalUser)()
For Each user As LocalUser In users
localUsers.Add(user)
Next
userBindingSource = Me.LocalUserBindingSource
userBindingSource.DataSource = localUsers
groupListBox = Me.lbox_grouplocal
Me.pnl_domain.Visible = False
Me.lbox_user.Height -= 32
Me.Height -= 100
End If
Me.lbox_user.Items.AddRange(users.ToArray()) 'ユーザのリストボックスにユーザを追加
Me.lbl_count.Text = String.Format("{0} 個のオブジェクト", userBindingSource.Count)
Me.lbox_user.SelectedIndex = userBindingSource.Position
Call ShowBelongGroups() '所属するグループを表示
End Sub
イベントハンドラ
Private Sub lbox_user_SelectedIndexChanged(
sender As Object, e As EventArgs) Handles lbox_user.SelectedIndexChanged
'選択されている項目を選択してもイベントが発生する
If userBindingSource.Position = Me.lbox_user.SelectedIndex Then
Return
End If
userBindingSource.Position = Me.lbox_user.SelectedIndex
Call ShowBelongGroups() '所属するグループを表示
End Sub
プライベートメソッド
Private Sub ShowBelongGroups() '所属するグループを表示
Dim user = DirectCast(userBindingSource.Current, IUser) '選択されたユーザ
groupListBox.Items.Clear()
For Each group In groups
If group.Native.IsMember(user.Entry.Path) Then 'グループに所属している時
groupListBox.Items.Add(group.Name)
End If
Next
If DirectoryAccess.IsLogonDomain Then 'ドメインにログオンしている時
Dim primaryGroupID = DirectCast(user, DomainUser).PrimaryGroupID
groupListBox.Items.Add(DirectoryAccess.GroupTokens.Item(primaryGroupID)) ‘プライマリ グループを追加
End If
End Sub
デザイナファイルの Dispose メソッド内の components.Dispose() の下に次のコードを追記
DirectoryAccess.DisposeItems(users)
DirectoryAccess.DisposeItems(groups)
続いてコンピュータのリスト。(グループリストは長いので別途書きます。)
まずは実行時の画面。(クリックすると新しいウィンドウで拡大図が表示されます。)
実装はこんな感じ。
プライベートフィールド
Private ReadOnly computers As IEnumerable(Of Computer) 'コンピュータのリスト
Private ReadOnly groups As IEnumerable(Of IGroup) 'グループのリスト
コンストラクタ
Public Sub New()
' この呼び出しはデザイナーで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します。
computers = DirectoryAccess.GetComputers() 'コンピュータのリストを取得
groups = DirectoryAccess.GetGroups() 'グループのリストを取得
Me.ComputerBindingSource.DataSource = computers
Me.lbox_pc.Items.AddRange(computers.ToArray()) 'コンピュータのリストボックスにコンピュータを追加
Me.lbl_count.Text = String.Format("{0} 個のオブジェクト", Me.ComputerBindingSource.Count)
Me.lbox_pc.SelectedIndex = Me.ComputerBindingSource.Position
Call ShowBelongGroups() '所属するグループを表示
End Sub
イベントハンドラ
Private Sub lbox_pc_SelectedIndexChanged(
sender As Object, e As EventArgs) Handles lbox_pc.SelectedIndexChanged
'選択されている項目を選択してもイベントが発生する
If Me.ComputerBindingSource.Position = Me.lbox_pc.SelectedIndex Then
Return
End If
Me.ComputerBindingSource.Position = Me.lbox_pc.SelectedIndex
Call ShowBelongGroups() '所属するグループを表示
End Sub
プライベートメソッド
Private Sub ShowBelongGroups() '所属するグループを表示
Dim pc = DirectCast(Me.ComputerBindingSource.Current, Computer) '選択されたコンピュータ
Me.lbox_group.Items.Clear()
For Each group In groups
If group.Native.IsMember(pc.Entry.Path) Then 'グループに所属している時
Me.lbox_group.Items.Add(group.Name)
End If
Next
Me.lbox_group.Items.Add(DirectoryAccess.GroupTokens.Item(pc.PrimaryGroupID)) ‘プライマリ グループを追加
End Sub
デザイナファイルの Dispose メソッド内の components.Dispose() の下に次のコードを追記
DirectoryAccess.DisposeItems(computers)
DirectoryAccess.DisposeItems(groups)
おまけ
Excel で 名前ボックス(数式バーの左にあるやつ)にセルのアドレスを入力するとそのセルを選択・表示できます。(「A1」と入力:「Application.Goto "R1C1", True」に相当)