所属しているグループをすべて取得する
TRANSCRIPT
![Page 1: 所属しているグループをすべて取得する](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55acd1da1a28ab4f078b45e7/html5/thumbnails/1.jpg)
所属しているグループをすべて取得する
小山 三智男
mitchin
Microsoft MVP for Directory Services
.NET アプリケーションに実装
![Page 2: 所属しているグループをすべて取得する](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55acd1da1a28ab4f078b45e7/html5/thumbnails/2.jpg)
2
ドメインのグループ
ドメインのグループにはビルトイン ローカル、ドメイン ローカル、グローバル、ユニバーサルの4種類のスコープがあります。
ビルトイン ローカル以外のグループはネストさせられます。
例えばユーザーをグローバル グループに所属させ、そのグローバル グループをドメイン ローカル グループに所属させる といった具合です。
スコープによって所属できる・できないがあります。
詳細はこちらのスライドを参照してください。
Active Directory Domain の Group ~スコープと種類、所属可能なグループとメンバー~
http://www.slideshare.net/mitchin227/group-40422613
![Page 3: 所属しているグループをすべて取得する](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55acd1da1a28ab4f078b45e7/html5/thumbnails/3.jpg)
所属するグループ
3
Active Directoryドメインではユーザー、グループ、コンピューターに 所属するグループがあり、ドメイン内で直接所属しているグループが表示されます。
![Page 4: 所属しているグループをすべて取得する](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55acd1da1a28ab4f078b45e7/html5/thumbnails/4.jpg)
ネストしているグループは?
4
ネストして間接的に所属しているグループは表示されません。
![Page 5: 所属しているグループをすべて取得する](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55acd1da1a28ab4f078b45e7/html5/thumbnails/5.jpg)
間接的に所属しているグループも表示したい
5
このように表示できたらいいかなと思い、サンプルアプリに機能を追加しました。
![Page 6: 所属しているグループをすべて取得する](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55acd1da1a28ab4f078b45e7/html5/thumbnails/6.jpg)
6
.NETで実装するためには
• .NETから Active Directory の色々な情報にアクセスするためにSystem.DirectoryServices アセンブリを参照する必要があります。
•Active Directory 内のデータにアクセスするために使用されるのは System.DirectoryServices 名前空間で、オブジェクトをカプセル化する DirectoryEntry クラスやクエリを実行するDirectorySearcher クラスなどがあります。
•ADSI(Active Directory Services Interfaces)を使用してネイティブなオブジェクトを扱う場合は Active DS Type Libraryを参照する必要があります。
![Page 7: 所属しているグループをすべて取得する](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55acd1da1a28ab4f078b45e7/html5/thumbnails/7.jpg)
7
どうやって接続するの?
ドメインに接続するには LDAP を使います。
プロバイダ:LDAP(Lightweight Directory Access Protocol)
書式例:LDAP://DC=proceed,DC=pbyk,DC=com
この LDAP の接続文字列を引数にして DirectoryEntry のインスタンスを作成します。
作成した DirectoryEntry がドメインを表し、検索のルートになります。(DirectorySearcher の引数になります。)
この場合、検索範囲はドメイン全体ということになります。
サンプルアプリはこれとは異なる方法で DirectoryEntry のインスタンスを作成しています。
![Page 8: 所属しているグループをすべて取得する](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55acd1da1a28ab4f078b45e7/html5/thumbnails/8.jpg)
検索してユーザーやグループを取得する
• 接続するドメインや取得したユーザーやグループは 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: 所属しているグループをすべて取得する](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55acd1da1a28ab4f078b45e7/html5/thumbnails/9.jpg)
すべての所属するグループの取得
サンプルアプリでは次の手順で対象メンバーのすべての所属するグループを取得するようにしました。
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: 所属しているグループをすべて取得する](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55acd1da1a28ab4f078b45e7/html5/thumbnails/10.jpg)
サンプルアプリのコード(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: 所属しているグループをすべて取得する](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55acd1da1a28ab4f078b45e7/html5/thumbnails/11.jpg)
サンプルアプリのコード(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: 所属しているグループをすべて取得する](https://reader034.vdocuments.pub/reader034/viewer/2022052206/55acd1da1a28ab4f078b45e7/html5/thumbnails/12.jpg)
詳細や関連情報はブログ等で
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