More Related Content
More from Michio Koyama (13)
グループのメンバーをすべて取得する
- 6. 6
.NETで実装するためには
•.NETから Active Directory の色々な情報にアクセスするために
System.DirectoryServices アセンブリを参照する必要がありま
す。
•Active Directory 内のデータにアクセスするために使用される
のは System.DirectoryServices 名前空間で、オブジェクトを
カプセル化する DirectoryEntry クラスやクエリを実行する
DirectorySearcher クラスなどがあります。
•ADSI(Active Directory Services Interfaces)を使用してネイ
ティブなオブジェクトを扱う場合は Active DS Type Libraryを
参照する必要があります。
- 7. サンプルアプリケーション
7
開発環境
• Domain:Windows Server 2012 R2
• Client:Windows 8.1 Pro、Windows 7 Professional SP1
• IDE:Visual Studio 2013 Update 4
• Projects:Windows Forms(.NET 4.5.1)
Web Forms(.NET 4.5.1) IE11、IE10
Class Library(.NET 4.5.1)
※ソースコード自体は .NET 4 相当
- 8. 8
どうやって接続するの?
ドメインに接続するには LDAP を使います。
プロバイダ:LDAP(Lightweight Directory Access Protocol)
書式例:LDAP://DC=proceed,DC=pbyk,DC=com
この LDAP の接続文字列を引数にして DirectoryEntry のインス
タンスを作成します。
作成した DirectoryEntry がドメインを表し、検索のルートにな
ります。(DirectorySearcher の引数になります。)
この場合、検索範囲はドメイン全体ということになります。
サンプルアプリはこれとは異なる方法で DirectoryEntry のイン
スタンスを作成しています。
- 9. 検索してグループのメンバーを取得する
• ドメインやユーザー、グループは DirectoryEntry オブジェクト
• ユーザやグループを検索するのは DirectorySearcher オブジェクト
• DirectorySearcher.FindOne メソッドで 1つだけ検索(戻り値は
SearchResult オブジェクト)、DirectorySearcher.FindAll メソッドです
べて検索(戻り値は SearchResultCollection)
• SearchResult.GetDirectoryEntry メソッドで DirectoryEntry を取得
• LDAP書式のフィルター文字列(DirectorySearcher.Filter プロパティ)は
次のように指定(属性=値 をカッコで括る)
• "(memberOf=CN=Administrators,CN=Builtin,DC=testdomain,DC=co
m)" -- Administrators グループのメンバー(testdomain.com の)
• "(&(objectCategory=Group)(name=Domain Admins))"
-- Domain Admins グループ
• "(&(|(objectCategory=User)(objectCategory=Computer))(primaryGr
oupID=513))"
-- プライマリ グループ IDが 513であるユーザーかコンピューター
9
- 10. すべてのメンバーの取得
サンプルアプリでは次の手順で対象グループのすべてのメンバー
を取得するようにしました。
1. memberOf 属性(所属するグループ)の値が 対象グループの
distinguishedName 属性(識別名)の値と一致するものを検
索(member 属性の各値のオブジェクトを取得)※
2. 対象グループをプライマリー グループとしているメンバーを
検索(ユーザーまたはコンピューターの primaryGroupID 属
性の値 = グループの primaryGroupToken 属性の値であれば
プライマリー グループのメンバー)
3. 取得したメンバーがグループならメンバーを再帰的に取得
※ memberOf 属性の各値と member 属性の各値及び
distinguishedName 属性の値は次のようになっています。
例)CN=Users,CN=Builtin,DC=proceed,DC=pbyk,DC=com
10
- 11. サンプルアプリのコード(VB)
CodePlex に公開しました。(Solution ごとダウンロード可能)
外部のセキュリティ プリンシパルを表すクラス
https://directoryvb.codeplex.com/SourceControl/latest#Lib
VB/ForeignSecurityPrincipal.vb
メンバーの取得など AD にアクセスするためのクラス
https://directoryvb.codeplex.com/SourceControl/latest#Lib
VB/Directory.vb
画面(Windows アプリ)のコード
https://directoryvb.codeplex.com/SourceControl/latest#Dir
ectoryVB/AllMemberList.vb
画面(Web アプリ)のコード
https://directoryvb.codeplex.com/SourceControl/latest#Dir
ectoryWebVB/AllMemberList.aspx.vb
11
- 12. サンプルアプリのコード(C#)
CodePlex に公開しました。(Solution ごとダウンロード可能)
外部のセキュリティ プリンシパルを表すクラス
https://directorycs.codeplex.com/SourceControl/latest#Dir
ectoryCS/LibCS/ForeignSecurityPrincipal.cs
メンバーの取得など AD にアクセスするためのクラス
https://directorycs.codeplex.com/SourceControl/latest#Dir
ectoryCS/LibCS/Directory.cs
画面(Windows アプリ)のコード
https://directorycs.codeplex.com/SourceControl/latest#Dir
ectoryCS/DirectoryCS/AllMemberList.cs
画面(Web アプリ)のコード
https://directorycs.codeplex.com/SourceControl/latest#Dir
ectoryCS/DirectoryWebCS/AllMemberList.aspx.cs
12