0
.NETからActive Directoryデータにアクセス
共有フォルダ情報を表示する

小山 三智男
mitchin
サンプルアプリケーション
開発環境
• OS:Windows 8.1 Pro、Windows 7 Professional SP1
• IDE:Visual Studio Professional 2013
• アプリ:Windows フォーム...
参照設定
• .NETから Active Directory の色々な情報にアクセスするために
System.DirectoryServices アセンブリを参照する必要がありま
す。
• ドメインやサイト関連は System.Director...
主にどんなデータがあるの?
管理ツール「Active Directory ユーザとコンピュータ」で管理
する以下のオブジェクト
• ユーザ
• グループ
• コンピュータ
• 組織単位(OU)
• プリンタ
• 共有フォルダ

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

IADsUser
IADsGroup

コンピュータ
組織単位(OU)
プリンタ

IADsCo...
どうやって接続するの?
ドメインに接続するには LDAP を使います。
プロバイダ:LDAP(Lightweight Directory Access Protocol)
書式例:LDAP://DC=virtual,DC=proceed,DC=...
検索して共有フォルダのリストを取得する
•
•
•
•
•

接続するドメインや取得した共有フォルダは DirectoryEntry オブジェクト
ユーザや共有フォルダを検索するのは DirectorySearcher オブジェクト
複数の検索...
共有フォルダのプロパティ
左:コントロール パネル、右:Active Directory 管理ツール

8
キーワード

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

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

11
クラスライブラリ側に追加したクラス
Volume (共有フォルダを表すクラス)
プロパティ
• Keywords (キーワードを取得または設定)
• UncPath (UNC パスを取得または設定)
メソッド
• FindByName (データ...
プロパティと属性の対応
プロパティ画面の「全般」タブの項目に対応する属性です。

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

14
フォーム側(Windowsアプリ)
• BindingSource のデータソースに Volume クラスを指定
• BindingSource を一覧 ListBox のデータソースに設定
• 詳細の各コントロールは BindingSourc...
フォーム側(Webアプリ)
• Volume クラスをビジネスオブジェクトとする
ObjectDataSource を2つ用意
• GetVolumes メソッドを指定したものを 一覧 ListBox のデータ
ソースに指定
• FindByN...
共有フォルダ取得サンプルコード(VB)
Public Shared Function GetVolumes() As IList(Of Volume)
Dim folders As New List(Of Volume)()
Using roo...
共有フォルダ取得サンプルコード(C#)
public static IList<Volume> GetVolumes() {
var folders = new List<Volume>();
using (var root = GetRoot...
詳細や関連情報はブログ等で
.NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~
http://www.slideshare.net/mitchin227/display-printer
ユーザやグループの...
Upcoming SlideShare
Loading in...5
×

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

539

Published on

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
539
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. .NETからActive Directoryデータにアクセス 共有フォルダ情報を表示する 小山 三智男 mitchin
  2. 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 2
  3. 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を 参照する必要があります。 3
  4. 4. 主にどんなデータがあるの? 管理ツール「Active Directory ユーザとコンピュータ」で管理 する以下のオブジェクト • ユーザ • グループ • コンピュータ • 組織単位(OU) • プリンタ • 共有フォルダ 4
  5. 5. ADSI 各オブジェクトは基本インターフェイス IADs を継承しています が共有フォルダ用のインターフェイスはなさそうです。 ユーザ グループ IADsUser IADsGroup コンピュータ 組織単位(OU) プリンタ IADsComputer IADsOU IADsPrintQueue 共有フォルダ DirectoryEntry.NativeObject プロパティの値を上記インター フェイスにキャストできます。但し IADsComputer は LDAP をサ ポートしていないので 実質キャストできません。 5
  6. 6. どうやって接続するの? ドメインに接続するには LDAP を使います。 プロバイダ:LDAP(Lightweight Directory Access Protocol) 書式例:LDAP://DC=virtual,DC=proceed,DC=local この LDAP の接続文字列を引数にして DirectoryEntry のインス タンスを作成します。 作成した DirectoryEntry がドメインを表し、検索のルートにな ります。(DirectorySearcher の引数になります。) この場合、検索範囲はドメイン全体ということになります。 6
  7. 7. 検索して共有フォルダのリストを取得する • • • • • 接続するドメインや取得した共有フォルダは DirectoryEntry オブジェクト ユーザや共有フォルダを検索するのは DirectorySearcher オブジェクト 複数の検索結果は SearchResultCollection として返される SearchResult.GetDirectoryEntry メソッドで DirectoryEntry を取得 LDAP書式のフィルター文字列(DirectorySearcher.Filter プロパティ)は 次のように指定(属性=値 をカッコで括る) • "(objectCategory=Volume)" -- 共有フォルダ • "(&(objectCategory=Volume)(!uNCName=Win2008TestDC*))" -- サーバが Win2008TestDC 以外の共有フォルダ • "(&(objectCategory=Volume)(|(keywords=開発部)(keywords= Development)))" -- 開発部か Development がキーワードの共有フォルダ 7
  8. 8. 共有フォルダのプロパティ 左:コントロール パネル、右:Active Directory 管理ツール 8
  9. 9. キーワード 9
  10. 10. 共有フォルダリスト画面(Winアプリ) 10
  11. 11. 共有フォルダリスト画面(Webアプリ) 11
  12. 12. クラスライブラリ側に追加したクラス Volume (共有フォルダを表すクラス) プロパティ • Keywords (キーワードを取得または設定) • UncPath (UNC パスを取得または設定) メソッド • FindByName (データバインド用:共有フォルダを検索) • GetVolumes (データバインド用:共有フォルダの一覧を取得) 12
  13. 13. プロパティと属性の対応 プロパティ画面の「全般」タブの項目に対応する属性です。 13
  14. 14. クラスライブラリ側 DirectoryAccess クラスに追加したパブリックなメンバ • GetVolumes メソッド (共有フォルダを取得) 14
  15. 15. フォーム側(Windowsアプリ) • BindingSource のデータソースに Volume クラスを指定 • BindingSource を一覧 ListBox のデータソースに設定 • 詳細の各コントロールは BindingSource(クラス)のプロパ ティにバインド • 共有フォルダの一覧を取得し BindingSource のデータソースに 設定 • 取得した共有フォルダの数を表示 • 一覧 ListBox の SelectedIndexChanged イベントで 選択した 共有フォルダの Keywords プロパティの値を キーワード TextBox の Lines プロパティに設定 15
  16. 16. フォーム側(Webアプリ) • Volume クラスをビジネスオブジェクトとする ObjectDataSource を2つ用意 • GetVolumes メソッドを指定したものを 一覧 ListBox のデータ ソースに指定 • FindByName メソッドを指定したものを 詳細 FormView のデー タソースに指定(パラメータ ソースは一覧 ListBox) • 一覧 ListBox 用 ObjectDataSource の Selected イベントで取 得した共有フォルダの数を表示 • 詳細 FormView 用 ObjectDataSource の Selecting イベントで 共有フォルダが未選択ならイベントをキャンセルし、Selected イベントで 選択した共有フォルダを変数に保持 • 詳細 FormView の DataBound イベントで 共有フォルダが選択 されていたら、変数の Keywords プロパティを改行で連結した 文字列を キーワード TextBox の Text プロパティに設定 16
  17. 17. 共有フォルダ取得サンプルコード(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)) Next End Using End Using End Using Return folders End Function ※root は一般的には New DirectoryEntry(LDAPのルートパス) をセット ※CreateInstance メソッドは DirectoryEntry から DirectoryObject を作成 17
  18. 18. 共有フォルダ取得サンプルコード(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
  19. 19. 詳細や関連情報はブログ等で .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.aspx http://blogs.wankuma.com/mitchin/archive/2014/01/13/328344.aspx 共有フォルダ用のクラス http://blogs.wankuma.com/mitchin/archive/2014/01/21/328357.aspx http://blogs.wankuma.com/mitchin/archive/2014/01/24/328358.aspx 共有フォルダリスト画面 http://blogs.wankuma.com/mitchin/archive/2014/01/29/328366.aspx http://blogs.wankuma.com/mitchin/archive/2014/01/30/328369.aspx 19
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×