netからactive directoryデータにアクセス ~共有フォルダ情報の取得と表示~

19
.NETからActive Directoryデータにアクセス 共有フォルダ情報を表示する 小山 三智男 mitchin

Upload: michio-koyama

Post on 07-Jul-2015

531 views

Category:

Technology


0 download

DESCRIPTION

Get volume objects from Active Directory and display on a windows/web form.

TRANSCRIPT

Page 1: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

.NETからActive Directoryデータにアクセス

共有フォルダ情報を表示する

小山 三智男

mitchin

Page 2: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

サンプルアプリケーション

2

開発環境

• OS:Windows 8.1 Pro、Windows 7 Professional SP1

• IDE:Visual Studio Professional 2013

•アプリ:Windows フォーム(.NET 4.5.1)

Web フォーム(.NET 4.5.1) IE11、IE10

クラスライブラリ(.NET 4.5.1)

※ソースコード自体は .NET 4 相当

実行環境

• 単一ドメイン、単一サイト、単一サブネット

• サーバ:Windows Server 2008 Standard SP2(.NET 4.5.1)

• IIS:Windows 認証

• クライアント:Windows 7 Professional SP1、IE10

Page 3: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

3

参照設定

•.NETから Active Directory の色々な情報にアクセスするためにSystem.DirectoryServices アセンブリを参照する必要があります。

•ドメインやサイト関連は System.DirectoryServices. ActiveDirectory 名前空間にそれらを表すクラスがあり、Active Directory の管理タスクを自動化するために使用されます。

•Active Directory 内のデータにアクセスするために使用されるのは System.DirectoryServices 名前空間で、オブジェクトをカプセル化する DirectoryEntry クラスやクエリを実行するDirectorySearcher クラスなどがあります。

•ADSI(Active Directory Services Interfaces)を使用してネイティブなオブジェクトを扱う場合は Active DS Type Libraryを参照する必要があります。

Page 4: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

4

主にどんなデータがあるの?

管理ツール「Active Directory ユーザとコンピュータ」で管理する以下のオブジェクト

• ユーザ

• グループ

• コンピュータ

• 組織単位(OU)

• プリンタ

• 共有フォルダ

Page 5: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

ADSI

各オブジェクトは基本インターフェイス IADs を継承していますが共有フォルダ用のインターフェイスはなさそうです。

DirectoryEntry.NativeObject プロパティの値を上記インターフェイスにキャストできます。但し IADsComputer は LDAP をサポートしていないので 実質キャストできません。

5

ユーザ IADsUser

グループ IADsGroup

コンピュータ IADsComputer

組織単位(OU) IADsOU

プリンタ IADsPrintQueue

共有フォルダ

Page 6: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

6

どうやって接続するの?

ドメインに接続するには LDAP を使います。

プロバイダ:LDAP(Lightweight Directory Access Protocol)

書式例:LDAP://DC=virtual,DC=proceed,DC=local

この LDAP の接続文字列を引数にして DirectoryEntry のインスタンスを作成します。

作成した DirectoryEntry がドメインを表し、検索のルートになります。(DirectorySearcher の引数になります。)

この場合、検索範囲はドメイン全体ということになります。

Page 7: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

検索して共有フォルダのリストを取得する

• 接続するドメインや取得した共有フォルダは DirectoryEntry オブジェクト

• ユーザや共有フォルダを検索するのは DirectorySearcher オブジェクト

• 複数の検索結果は SearchResultCollection として返される

• SearchResult.GetDirectoryEntry メソッドで DirectoryEntry を取得

• LDAP書式のフィルター文字列(DirectorySearcher.Filter プロパティ)は次のように指定(属性=値 をカッコで括る)

• "(objectCategory=Volume)" -- 共有フォルダ

• "(&(objectCategory=Volume)(!uNCName=\\Win2008TestDC\*))"

-- サーバが Win2008TestDC 以外の共有フォルダ

• "(&(objectCategory=Volume)(|(keywords=開発部)(keywords= Development)))"

-- 開発部か Development がキーワードの共有フォルダ

7

Page 8: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

共有フォルダのプロパティ

左:コントロール パネル、右:Active Directory 管理ツール

8

Page 9: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

キーワード

9

Page 10: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

共有フォルダリスト画面(Winアプリ)

10

Page 11: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

共有フォルダリスト画面(Webアプリ)

11

Page 12: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

クラスライブラリ側に追加したクラス

Volume (共有フォルダを表すクラス)

プロパティ• Keywords (キーワードを取得または設定)• UncPath (UNC パスを取得または設定)

メソッド• FindByName (データバインド用:共有フォルダを検索)• GetVolumes (データバインド用:共有フォルダの一覧を取得)

12

Page 13: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

プロパティと属性の対応

プロパティ画面の「全般」タブの項目に対応する属性です。

13

Page 14: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

クラスライブラリ側

DirectoryAccess クラスに追加したパブリックなメンバ• GetVolumes メソッド (共有フォルダを取得)

14

Page 15: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

フォーム側(Windowsアプリ)

• BindingSource のデータソースに Volume クラスを指定

• BindingSource を一覧 ListBox のデータソースに設定

• 詳細の各コントロールは BindingSource(クラス)のプロパティにバインド

• 共有フォルダの一覧を取得し BindingSource のデータソースに設定

• 取得した共有フォルダの数を表示

• 一覧 ListBox の SelectedIndexChanged イベントで 選択した共有フォルダの Keywords プロパティの値を キーワードTextBox の Lines プロパティに設定

15

Page 16: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

フォーム側(Webアプリ)

• Volume クラスをビジネスオブジェクトとするObjectDataSource を2つ用意

• GetVolumes メソッドを指定したものを 一覧 ListBox のデータソースに指定

• FindByName メソッドを指定したものを 詳細 FormView のデータソースに指定(パラメータ ソースは一覧 ListBox)

• 一覧 ListBox 用 ObjectDataSource の Selected イベントで取得した共有フォルダの数を表示

• 詳細 FormView 用 ObjectDataSource の Selecting イベントで共有フォルダが未選択ならイベントをキャンセルし、Selected イベントで 選択した共有フォルダを変数に保持

• 詳細 FormView の DataBound イベントで 共有フォルダが選択されていたら、変数の Keywords プロパティを改行で連結した文字列を キーワード TextBox の Text プロパティに設定

16

Page 17: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

共有フォルダ取得サンプルコード(VB)

Public Shared Function GetVolumes() As IList(Of Volume)Dim folders As New List(Of Volume)()Using root = GetRootEntry() 'ルートのDirectoryEntryを取得Dim filter = "(objectCategory=Volume)"Using searcher As New DirectorySearcher(root, filter)Using results = searcher.FindAll()For Each res As SearchResult In results

folders.Add(DirectCast(CreateInstance(res.GetDirectoryEntry()), Volume))

NextEnd Using

End UsingEnd UsingReturn folders

End Function※root は一般的には New DirectoryEntry(LDAPのルートパス) をセット※CreateInstance メソッドは DirectoryEntry から DirectoryObject を作成

17

Page 18: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

共有フォルダ取得サンプルコード(C#)

public static IList<Volume> GetVolumes() {var folders = new List<Volume>();using (var root = GetRootEntry()) { //ルートのDirectoryEntryを取得var filter = "(objectCategory=Volume)";using (var searcher = new DirectorySearcher(root, filter)) {using (var results = searcher.FindAll()) {foreach (SearchResult res in results) {

folders.Add((Volume)CreateInstance(res.GetDirectoryEntry()));

}}

}}

return folders;}※root は一般的には new DirectoryEntry(LDAPのルートパス) をセット※CreateInstance メソッドは DirectoryEntry から DirectoryObject を作成

18

Page 19: NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~

詳細や関連情報はブログ等で

.NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~http://www.slideshare.net/mitchin227/display-printer

ユーザやグループの検索http://blogs.wankuma.com/mitchin/archive/2013/06/26/327958.aspx

Active Directory 内のオブジェクトの検索指定http://blogs.wankuma.com/mitchin/archive/2013/06/28/327969.aspx

共有フォルダのプロパティ画面の項目と属性の対応http://blogs.wankuma.com/mitchin/archive/2014/01/11/328342.aspxhttp://blogs.wankuma.com/mitchin/archive/2014/01/13/328344.aspx

共有フォルダ用のクラスhttp://blogs.wankuma.com/mitchin/archive/2014/01/21/328357.aspxhttp://blogs.wankuma.com/mitchin/archive/2014/01/24/328358.aspx

共有フォルダリスト画面http://blogs.wankuma.com/mitchin/archive/2014/01/29/328366.aspxhttp://blogs.wankuma.com/mitchin/archive/2014/01/30/328369.aspx

19