所属しているグループをすべて取得する

12
所属しているグループをすべて取得する 小山 三智男 mitchin Microsoft MVP for Directory Services .NET アプリケーションに実装

Upload: michio-koyama

Post on 20-Jul-2015

760 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: 所属しているグループをすべて取得する

所属しているグループをすべて取得する

小山 三智男

mitchin

Microsoft MVP for Directory Services

.NET アプリケーションに実装

Page 2: 所属しているグループをすべて取得する

2

ドメインのグループ

ドメインのグループにはビルトイン ローカル、ドメイン ローカル、グローバル、ユニバーサルの4種類のスコープがあります。

ビルトイン ローカル以外のグループはネストさせられます。

例えばユーザーをグローバル グループに所属させ、そのグローバル グループをドメイン ローカル グループに所属させる といった具合です。

スコープによって所属できる・できないがあります。

詳細はこちらのスライドを参照してください。

Active Directory Domain の Group ~スコープと種類、所属可能なグループとメンバー~

http://www.slideshare.net/mitchin227/group-40422613

Page 3: 所属しているグループをすべて取得する

所属するグループ

3

Active Directoryドメインではユーザー、グループ、コンピューターに 所属するグループがあり、ドメイン内で直接所属しているグループが表示されます。

Page 4: 所属しているグループをすべて取得する

ネストしているグループは?

4

ネストして間接的に所属しているグループは表示されません。

Page 5: 所属しているグループをすべて取得する

間接的に所属しているグループも表示したい

5

このように表示できたらいいかなと思い、サンプルアプリに機能を追加しました。

Page 6: 所属しているグループをすべて取得する

6

.NETで実装するためには

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

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

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

Page 7: 所属しているグループをすべて取得する

7

どうやって接続するの?

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

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

書式例:LDAP://DC=proceed,DC=pbyk,DC=com

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

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

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

サンプルアプリはこれとは異なる方法で DirectoryEntry のインスタンスを作成しています。

Page 8: 所属しているグループをすべて取得する

検索してユーザーやグループを取得する

• 接続するドメインや取得したユーザーやグループは DirectoryEntry オブジェクト

• ユーザやグループを検索するのは DirectorySearcher オブジェクト

• 検索結果は、1つだけ取得する場合は SearchResult オブジェクト、複数取得する場合は SearchResultCollection として返される

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

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

• "(objectCategory=Group)" -- すべてのグループ

• "(&(objectCategory=User)(sAMAccountName=koyama))"

-- ログオン名が koyamaであるユーザー

• "(&(|(objectCategory=User)(objectCategory=Computer))(primaryGroupID=513))"

-- プライマリ グループ IDが 513であるユーザーかコンピューター

8

Page 9: 所属しているグループをすべて取得する

すべての所属するグループの取得

サンプルアプリでは次の手順で対象メンバーのすべての所属するグループを取得するようにしました。

1. すべてのグループを取得して、distinguishedName 属性(識別名)の値をキーにした Dictionary に保持

2. メンバーがユーザーかコンピューターならプライマリー グループを取得(メンバーの primaryGroupID 属性の値 = グループの primaryGroupToken 属性の値ならそのグループがプライマリー グループ)

3. 2で取得したグループの所属するグループを再帰的に取得※

4. メンバーの所属するグループを再帰的に取得※

※ memberOf 属性の各値をキーに Dictionary からグループを取得(memberOf の 1つの値 = distinguishedName の値)

例)CN=Users,CN=Builtin,DC=proceed,DC=pbyk,DC=com

9

Page 10: 所属しているグループをすべて取得する

サンプルアプリのコード(VB)

CodePlex に公開しました。

グループのクラスhttps://directoryvb.codeplex.com/SourceControl/latest#LibVB/Group.vb

グループの取得など Directory にアクセスするためのクラスhttps://directoryvb.codeplex.com/SourceControl/latest#LibVB/Directory.vb

画面(Windows アプリ)のコードhttps://directoryvb.codeplex.com/SourceControl/latest#DirectoryVB/InRoleGroupList.vb

画面(Web アプリ)のコードhttps://directoryvb.codeplex.com/SourceControl/latest#DirectoryWebVB/InRoleGroupList.aspx.vb

10

Page 11: 所属しているグループをすべて取得する

サンプルアプリのコード(C#)

CodePlex に公開しました。

グループのクラスhttps://directorycs.codeplex.com/SourceControl/latest#DirectoryCS/LibCS/Group.cs

グループの取得など Directory にアクセスするためのクラスhttps://directorycs.codeplex.com/SourceControl/latest#DirectoryCS/LibCS/Directory.cs

画面(Windows アプリ)のコードhttps://directorycs.codeplex.com/SourceControl/latest#DirectoryCS/DirectoryCS/InRoleGroupList.cs

画面(Web アプリ)のコードhttps://directorycs.codeplex.com/SourceControl/latest#DirectoryCS/DirectoryWebCS/InRoleGroupList.aspx.cs

11

Page 12: 所属しているグループをすべて取得する

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

Active Directoryドメインを作ってみよう ~その2:ユーザーやグループの作成とPCのドメイン参加~http://www.slideshare.net/mitchin227/create-domainobject

CodePlex に公開したサンプルアプリ(ダウンロード可能です)https://directoryvb.codeplex.com/SourceControl/latesthttps://directorycs.codeplex.com/SourceControl/latest

所属しているすべてのグループを表示する画面http://blogs.wankuma.com/mitchin/archive/2015/01/04/500492.aspx

所属しているすべてのグループを表示する画面のWindowsアプリのコードhttp://blogs.wankuma.com/mitchin/archive/2015/01/06/500555.aspxhttp://blogs.wankuma.com/mitchin/archive/2015/01/08/500665.aspx

所属しているすべてのグループを表示する画面のWebアプリのコードhttp://blogs.wankuma.com/mitchin/archive/2015/01/10/500707.aspxhttp://blogs.wankuma.com/mitchin/archive/2015/01/10/500708.aspx

Active Directory 関連ブログの一覧http://www.pbyk.com/blog/bloglist.html

12