netからactive directoryデータにアクセス ~プリンタ情報の取得と表示~
DESCRIPTION
Get printer objects from Active Directory and display on a windows/web form.TRANSCRIPT
![Page 1: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/1.jpg)
.NETからActive Directoryデータにアクセス
プリンタ情報を表示する
小山 三智男
mitchin
![Page 2: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/2.jpg)
サンプルアプリケーション
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データにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/3.jpg)
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データにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/4.jpg)
4
主にどんなデータがあるの?
管理ツール「Active Directory ユーザとコンピュータ」で管理する以下のオブジェクト
• ユーザ
• グループ
• コンピュータ
• 組織単位(OU)
• プリンタ
• 共有フォルダ
![Page 5: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/5.jpg)
ADSI
基本インターフェイスは IADs で、各オブジェクトはこのインターフェイスを継承しています。
DirectoryEntry.NativeObject プロパティの値を上記インターフェイスにキャストできます。但し IADsComputer は LDAP をサポートしていないので 実質キャストできません。
5
ユーザ IADsUser
グループ IADsGroup
コンピュータ IADsComputer
組織単位(OU) IADsOU
プリンタ IADsPrintQueue
共有フォルダ
![Page 6: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/6.jpg)
6
どうやって接続するの?
ドメインに接続するには LDAP を使います。
プロバイダ:LDAP(Lightweight Directory Access Protocol)
書式例:LDAP://DC=virtual,DC=proceed,DC=local
この LDAP の接続文字列を引数にして DirectoryEntry のインスタンスを作成します。
作成した DirectoryEntry がドメインを表し、検索のルートになります。(DirectorySearcher の引数になります。)
この場合、検索範囲はドメイン全体ということになります。
![Page 7: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/7.jpg)
検索してプリンタのリストを取得する
• 接続するドメインや取得したプリンタは DirectoryEntry オブジェクト
• ユーザやプリンタを検索するのは DirectorySearcher オブジェクト
• 複数の検索結果は SearchResultCollection として返される
• SearchResult.GetDirectoryEntry メソッドで DirectoryEntry を取得
• LDAP書式のフィルター文字列(DirectorySearcher.Filter プロパティ)は次のように指定(属性=値 をカッコで括る)
• "(objectCategory=PrintQueue)" -- プリンタ
• "(&(objectCategory=PrintQueue)(!location=*本社))" -- 本社以外のプリンタ
• "(&(objectCategory=PrintQueue)(|(printColor=False)(printDuplexSupported=False)))" -- モノクロか片面印刷のプリンタ
• "(&(objectCategory=PrintQueue)(printPagesPerMinute>=30))" -- 1分間に30枚以上印刷できるプリンタ
7
![Page 8: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/8.jpg)
プリンタのプロパティ
左:コントロールパネル、右:管理ツール
8
![Page 9: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/9.jpg)
プリンタリスト画面(Windowsアプリ)
9
![Page 10: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/10.jpg)
プリンタリスト画面(Webアプリ)
10
![Page 11: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/11.jpg)
クラスライブラリ側に追加したクラス
PrintQueue (プリンタを表すクラス)プロパティ• Color, Duplex (カラー/両面 かどうかを取得または設定)• FullName (名前を取得)• Location (場所を取得または設定)• MaxResolution (最高解像度を取得または設定)• Model (モデルを取得または設定)• Name, ServerName (プリンタ名/サーバ名 を取得)• Speed (印刷速度を取得または設定)• Stapling (ホチキス止めかどうかを取得または設定)
メソッド• FindByName (データバインド用:プリンタを検索)• GetPrintQueues (データバインド用:プリンタの一覧を取得)
11
![Page 12: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/12.jpg)
プロパティと属性の対応
プロパティ画面の「全般」タブの項目に対応する属性です。
12
![Page 13: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/13.jpg)
参考:プリンタの属性
プリンタにはサンプルアプリで使用する属性以外にも次のような属性があります。
•portName:ポート - ポート
•printCollate:詳細設定 - 詳細な印刷機能を有効にする
•printKeepPrintedJobs:詳細設定 - 印刷後ドキュメントを残す
•printMediaReady:全般 - 利用可能な用紙
•printShareName:共有 - 共有名
•printSpooling :詳細設定 - スプール/直接 の選択
•Priority:詳細設定 - 優先順位
•shortServerName:serverNameのコンピュータ名部分
•uNCName:UNCパス(\\serverName\printerName)
13
![Page 14: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/14.jpg)
クラスライブラリ側
DirectoryAccess クラスに追加したパブリックなメンバ• GetPrintQueues メソッド (プリンタを取得)
14
![Page 15: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/15.jpg)
フォーム側(Windowsアプリ)
• BindingSource のデータソースに PrintQueue クラスを指定
• BindingSource を一覧 ListBox のデータソースに設定
• 詳細の各コントロールは BindingSource(クラス)のプロパティにバインド
• プリンタの一覧を取得し BindingSource のデータソースに設定
• 取得したプリンタの数を表示
15
![Page 16: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/16.jpg)
フォーム側(Webアプリ)
• PrintQueue クラスをビジネスオブジェクトとするObjectDataSource を2つ用意
• GetPrintQueues メソッドを指定したものを 一覧 ListBox のデータソースに指定
• FindByName メソッドを指定したものを 詳細 FormView のデータソースに指定(パラメータ ソースは一覧 ListBox)
• 一覧 ListBox 用 ObjectDataSource の Selected イベントで取得したプリンタの数を表示
• 詳細 FormView 用 ObjectDataSource の Selecting イベントでプリンタが未選択ならイベントをキャンセルし、Selected イベントで 選択したプリンタの印刷速度、最高解像度の値をViewState に保持
• 印刷速度、最高解像度の値変更時に値をチェック、実数なら小数部を切捨て、数値に変換できなければ変更前の値に戻す
16
![Page 17: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/17.jpg)
プリンタ取得サンプルコード(VB)
Public Shared Function GetPrintQueues() As IList(Of PrintQueue)Dim printers As New List(Of PrintQueue)()Using root = GetRootEntry() 'ルートのDirectoryEntryを取得Dim filter = "(objectCategory= PrintQueue)"Using searcher As New DirectorySearcher(root, filter)Using results = searcher.FindAll()For Each res As SearchResult In resultsprinters.Add(DirectCast(CreateInstance(res.GetDirectoryEntry()), PrintQueue))
NextEnd Using
End UsingEnd UsingReturn printers
End Function※root は一般的には New DirectoryEntry(LDAPのルートパス) をセット※CreateInstance メソッドは DirectoryEntry から DirectoryObject を作成
17
![Page 18: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/18.jpg)
プリンタ取得サンプルコード(C#)
public static IList<PrintQueue> GetPrintQueues() {var printers = new List<PrintQueue>();using (var root = GetRootEntry()) { //ルートのDirectoryEntryを取得var filter = "(objectCategory=PrintQueue)";using (var searcher = new DirectorySearcher(root, filter)) {using (var results = searcher.FindAll()) {foreach (SearchResult res in results) {
printers.Add((PrintQueue)CreateInstance(res.GetDirectoryEntry()));
}}
}}
return printers;}※root は一般的には new DirectoryEntry(LDAPのルートパス) をセット※CreateInstance メソッドは DirectoryEntry から DirectoryObject を作成
18
![Page 19: NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~](https://reader037.vdocuments.pub/reader037/viewer/2022100213/559b34181a28ab49638b46b4/html5/thumbnails/19.jpg)
詳細や関連情報はブログ等で
.NETからActive Directoryデータにアクセス ~ユーザ情報の取得と表示~http://www.slideshare.net/mitchin227/display-user
ユーザやグループの検索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/2013/12/29/328318.aspx
プリンタ用のクラスhttp://blogs.wankuma.com/mitchin/archive/2014/01/04/328325.aspxhttp://blogs.wankuma.com/mitchin/archive/2014/01/05/328326.aspx
プリンタリスト画面http://blogs.wankuma.com/mitchin/archive/2014/01/07/328332.aspx
追加したプリンタを特定の組織単位(OU)に配置するhttp://blogs.wankuma.com/mitchin/archive/2014/01/09/328337.aspx
19