.NETからActive Directoryデータにアクセス
コンピュータ情報を表示する

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

4
サンプルアプリケーションの初期画面

ドメインを取得して画面下部に
接続先を表示しています。
5
コンピュータリスト画面(Windowsアプリ)

6
コンピュータリスト画面(Webアプリ)

7
どうやって接続するの?
ドメインに接続するには LDAP を使います。
プロバイダ:LDAP(Lightweight Directory Access Protocol)
書式例:LDAP://DC=virtual,DC=proceed,DC=...
検索してコンピュータのリストを取得する
• 接続するドメインや取得したコンピュータは DirectoryEntry オブジェク
ト
• ユーザやコンピュータを検索するのは DirectorySearcher オブジェクト
• 複数の検索結果は ...
ADSI のインターフェイス
基本インターフェイスは IADs インターフェイスで、各オブジェ
クトはこのインターフェイスを継承しています。
オブジェクトとそれに対応するインターフェイス

ユーザ
グループ
コンピュータ
組織単位(OU)
プリ...
IADsComputer の残念なお知らせ
IADsComputer インターフェイスは LDAP をサポートしていませ
ん。
なのでキャストしようとすると InvalidCastException がスロー
されます。
IADs インターフェ...
クラスライブラリ側に追加したクラス
Computer (コンピュータを表すクラス)
プロパティ
• FullName (DNS名を取得)
• OperatingSystem (OSを取得)
• OperatingSystemServicePac...
クラスライブラリ側
DirectoryAccess クラスに追加したパブリックなメンバ
• GetComputers メソッド(コンピュータの一覧を取得)

13
フォーム側(Windowsアプリ)
• BindingSource のデータソースに Computer クラスを指定
• BindingSource を一覧 ListBox のデータソースに設定
• 詳細の各コントロールは BindingSou...
フォーム側(Webアプリ)
• Computer クラスをビジネスオブジェクトとする
ObjectDataSource を3つ用意
• GetComputers メソッドを指定したものを一覧 ListBox のデー
タソースに指定
• Find...
コンピュータ取得サンプルコード(VB)
Public Shared Function GetComputers() As IList(Of Computer)
Dim computers As New List(Of Computer)()
U...
コンピュータ取得サンプルコード(C#)
public static IList<Computer> GetComputers() {
var computers = new List<Computer>();
using (var root =...
所属するグループの取得(VB)
Public Function GetBelongGroups(groups As IEnumerable(Of
DomainGroup)) As ReadOnlyCollection(Of String)
Di...
所属するグループの取得(C#)
Public ReadOnlyCollection<string>
GetBelongGroups(IEnumerable<DomainGroup> groups)
{
var belongGroups = gr...
詳細や関連情報はブログ等で
.NETからActive Directoryにアクセス
http://www.slideshare.net/mitchin227/active-directory-24695891
ユーザやグループの検索
http:...
Upcoming SlideShare
Loading in …5
×

.NETからActive Directoryデータにアクセス ~コンピュータ情報の取得と表示~

878 views

Published on

Get computer 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
878
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
3
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

.NETからActive Directoryデータにアクセス ~コンピュータ情報の取得と表示~

  1. 1. .NETからActive Directoryデータにアクセス コンピュータ情報を表示する 小山 三智男 mitchin
  2. 2. サンプルアプリケーション 開発環境 • OS:Windows 8 Enterprise(x64) • IDE:Visual Studio Professional 2013 • アプリ:Windows フォーム(.NET 4.5.1) Web フォーム(.NET 4.5.1) IE10 クラスライブラリ(.NET 4.5.1) ※ソースコード自体は .NET 4 相当 実行環境 • 単一ドメイン、単一サイト、単一サブネット • サーバ:Windows Server 2008 Standard SP2(.NET 4.5.1) • IIS:Windows 認証 • クライアント:Windows 7、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. サンプルアプリケーションの初期画面 ドメインを取得して画面下部に 接続先を表示しています。 5
  6. 6. コンピュータリスト画面(Windowsアプリ) 6
  7. 7. コンピュータリスト画面(Webアプリ) 7
  8. 8. どうやって接続するの? ドメインに接続するには LDAP を使います。 プロバイダ:LDAP(Lightweight Directory Access Protocol) 書式例:LDAP://DC=virtual,DC=proceed,DC=local この LDAP の接続文字列を引数にして DirectoryEntry のインス タンスを作成します。 この DirectoryEntry がドメインを表し、検索のルートになりま す。(DirectorySearcher の引数になります。) この場合、検索範囲はドメイン全体ということになります。 8
  9. 9. 検索してコンピュータのリストを取得する • 接続するドメインや取得したコンピュータは DirectoryEntry オブジェク ト • ユーザやコンピュータを検索するのは DirectorySearcher オブジェクト • 複数の検索結果は SearchResultCollection として返される • SearchResult.GetDirectoryEntry メソッドで DirectoryEntry を取得 • LDAP書式のフィルター文字列(DirectorySearcher.Filter プロパティ)は 次のように指定(属性=値 をカッコで括る) • "(objectCategory=Computer)" -- コンピュータ • "(&(objectCategory=Computer)(!operatingSystem=Windows 8*))" -Windows 8 以外のコンピュータ • "(&(objectCategory=Computer)(|(operatingSystem=Windows Server*)(operatingSystem=Windows 8*)))" -- Windows Server か Windows 8 のコンピュータ • "(&(objectCategory=Computer)(logonCount>=100))" -- 100回以上ログ オンしているコンピュータ 9
  10. 10. ADSI のインターフェイス 基本インターフェイスは IADs インターフェイスで、各オブジェ クトはこのインターフェイスを継承しています。 オブジェクトとそれに対応するインターフェイス ユーザ グループ コンピュータ 組織単位(OU) プリンタ 共有フォルダ IADsUser IADsGroup IADsComputer IADsOU IADsPrintQueue DirectoryEntry.NativeObject プロパティの値を上記インター フェイスにキャストできます。が・・・ 10
  11. 11. IADsComputer の残念なお知らせ IADsComputer インターフェイスは LDAP をサポートしていませ ん。 なのでキャストしようとすると InvalidCastException がスロー されます。 IADs インターフェイスにはキャストできますが、サンプルアプ リケーションでは積極的に使用する理由がないので、今回追加し たコンピュータを表すクラス(後述)にはユーザやグループを表 すクラスのように ADSI オブジェクトを取得する Native プロパ ティを実装していません。 ユーザやグループについてはこちらのスライドを参照 http://www.slideshare.net/mitchin227/display-user http://www.slideshare.net/mitchin227/display-group 11
  12. 12. クラスライブラリ側に追加したクラス Computer (コンピュータを表すクラス) プロパティ • FullName (DNS名を取得) • OperatingSystem (OSを取得) • OperatingSystemServicePack (OSのService Packを取得) • OperatingSystemVersion (OSのバージョンを取得) • PrimaryGroupId (プライマリ グループIDを取得) • Role (役割を取得) • Site (サイトを取得) メソッド • FindByName (コンピュータを検索) • GetBelongGroups (所属するグループを取得) • GetComputers (コンピュータの一覧を取得) 12
  13. 13. クラスライブラリ側 DirectoryAccess クラスに追加したパブリックなメンバ • GetComputers メソッド(コンピュータの一覧を取得) 13
  14. 14. フォーム側(Windowsアプリ) • BindingSource のデータソースに Computer クラスを指定 • BindingSource を一覧 ListBox のデータソースに設定 • 詳細の各コントロールは BindingSource(クラス)のプロパ ティにバインド • グループの一覧を取得し、内部に保持 • コンピュータの一覧を取得し BindingSource のデータソースに 設定 • 取得したコンピュータの数を表示 • 選択されたコンピュータの所属するグループを取得し、所属す るグループ ListBox のデータソースに設定 14
  15. 15. フォーム側(Webアプリ) • Computer クラスをビジネスオブジェクトとする ObjectDataSource を3つ用意 • GetComputers メソッドを指定したものを一覧 ListBox のデー タソースに指定 • FindByName メソッドを指定したものを詳細 FormView のデータ ソースに指定(パラメーター ソースは一覧 ListBox) • GetBelongGroups メソッドを指定したものを所属するグループ ListBox のデータソースに設定 • 一覧 ListBox 用 ObjectDataSource の Selected イベントで取 得したコンピュータの数を表示 15
  16. 16. コンピュータ取得サンプルコード(VB) Public Shared Function GetComputers() As IList(Of Computer) Dim computers As New List(Of Computer)() Using root = GetRootEntry() 'ルートのDirectoryEntryを取得 Dim filter = String.Format("(objectCategory={0})", CategoryType.Computer) Using searcher As New DirectorySearcher(root, filter) Using results = searcher.FindAll() For Each res As SearchResult In results computers.Add(DirectCast( CreateInstance(res.GetDirectoryEntry()), Computer)) Next End Using End Using End Using Return computers End Function ※root は一般的には New DirectoryEntry(LDAPのルートパス) をセット ※CreateInstance メソッドは DirectoryEntry から DirectoryObject を作成 16
  17. 17. コンピュータ取得サンプルコード(C#) public static IList<Computer> GetComputers() { var computers = new List<Computer>(); using (var root = GetRootEntry()) { //ルートのDirectoryEntryを取得 var filter = String.Format("(objectCategory={0})", CategoryType.Computer); using (var searcher = new DirectorySearcher(root, filter)) { using (var results = searcher.FindAll()) { foreach (SearchResult res in results) { groups.Add( (Computer)CreateInstance(res.GetDirectoryEntry())); } } } } return computers; } ※root は一般的には new DirectoryEntry(LDAPのルートパス) をセット ※CreateInstance メソッドは DirectoryEntry から DirectoryObject を作成 17
  18. 18. 所属するグループの取得(VB) Public Function GetBelongGroups(groups As IEnumerable(Of DomainGroup)) As ReadOnlyCollection(Of String) Dim belongGroups = groups.Where( Function(group) group.Native.IsMember(MyBase.Entry.Path)).Select( Function(group) group.Name).ToList() belongGroups.Add( DirectoryAccess.GroupTokens.Item(Me.PrimaryGroupId)) belongGroups.Sort() Return belongGroups.AsReadOnly() End Function ユーザの場合は IADsUser.Groups メソッドで所属するグループを取得できます が、コンピュータの場合はできないのでグループのコレクションが必要です。 個々のグループに対してメンバであれば(IADsGroup.IsMember メソッドが True を返せば)そのグループに所属していると判断しています。 プライマリ グループの追加についてはユーザの場合と同じです。 18
  19. 19. 所属するグループの取得(C#) Public ReadOnlyCollection<string> GetBelongGroups(IEnumerable<DomainGroup> groups) { var belongGroups = groups.Where( group => group.Native.IsMember(base.Entry.Path)).Select group => group.Name).ToList(); belongGroups.Add( DirectoryAccess.GroupTokens[this.PrimaryGroupId]); belongGroups.Sort(); return belongGroups.AsReadOnly(); } 19
  20. 20. 詳細や関連情報はブログ等で .NETからActive Directoryにアクセス http://www.slideshare.net/mitchin227/active-directory-24695891 ユーザやグループの検索 http://blogs.wankuma.com/mitchin/archive/2013/06/26/327958.aspx SearchResultCollectionクラス http://blogs.wankuma.com/mitchin/archive/2013/06/30/327977.aspx ネイティブ ADSI オブジェクト http://blogs.wankuma.com/mitchin/archive/2013/07/01/327981.aspx ユーザの所属するグループの取得 http://blogs.wankuma.com/mitchin/archive/2013/07/11/327999.aspx コンピュータ用のクラス http://blogs.wankuma.com/mitchin/archive/2013/11/09/328208.aspx http://blogs.wankuma.com/mitchin/archive/2013/11/10/328210.aspx コンピュータリスト画面 http://blogs.wankuma.com/mitchin/archive/2013/11/13/328220.aspx 20

×