SlideShare a Scribd company logo
1 of 13
グループのメンバーをすべて取得する
小山 三智男
mitchin
Microsoft MVP for Directory Services
.NET アプリケーションに実装
2
ドメインのグループ
ドメインのグループにはビルトイン ローカル、ドメイン ローカ
ル、グローバル、ユニバーサルの4種類のスコープがあります。
グループはネストさせることができます。
例えば Users グループ(ビルトイン ローカル)のメンバーには
Domain Users グループ(グローバル)がいて、Domain Users
グループのメンバーにユーザーがいる といった具合です。
スコープによってメンバーにできる・できないがあります。
詳細はこちらのスライドを参照してください。
Active Directory Domain の Group ~スコープと種類、所属可
能なグループとメンバー~
http://www.slideshare.net/mitchin227/group-40422613
グループのメンバー
3
Active Directoryドメインでは、ユーザー、グループ、コン
ピューター、外部のセキュリティ プリンシパルがグループのメン
バーになります。
ネストしているグループのメンバーは?
4
メンバーになっているグループのメンバーは表示されません。
間接的なグループのメンバーも表示したい
5
このように表示できたらいいかなと思い、サンプルアプリに機能
を追加しました。
6
.NETで実装するためには
•.NETから Active Directory の色々な情報にアクセスするために
System.DirectoryServices アセンブリを参照する必要がありま
す。
•Active Directory 内のデータにアクセスするために使用される
のは System.DirectoryServices 名前空間で、オブジェクトを
カプセル化する DirectoryEntry クラスやクエリを実行する
DirectorySearcher クラスなどがあります。
•ADSI(Active Directory Services Interfaces)を使用してネイ
ティブなオブジェクトを扱う場合は Active DS Type Libraryを
参照する必要があります。
サンプルアプリケーション
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
どうやって接続するの?
ドメインに接続するには LDAP を使います。
プロバイダ:LDAP(Lightweight Directory Access Protocol)
書式例:LDAP://DC=proceed,DC=pbyk,DC=com
この LDAP の接続文字列を引数にして DirectoryEntry のインス
タンスを作成します。
作成した DirectoryEntry がドメインを表し、検索のルートにな
ります。(DirectorySearcher の引数になります。)
この場合、検索範囲はドメイン全体ということになります。
サンプルアプリはこれとは異なる方法で DirectoryEntry のイン
スタンスを作成しています。
検索してグループのメンバーを取得する
• ドメインやユーザー、グループは 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
すべてのメンバーの取得
サンプルアプリでは次の手順で対象グループのすべてのメンバー
を取得するようにしました。
1. memberOf 属性(所属するグループ)の値が 対象グループの
distinguishedName 属性(識別名)の値と一致するものを検
索(member 属性の各値のオブジェクトを取得)※
2. 対象グループをプライマリー グループとしているメンバーを
検索(ユーザーまたはコンピューターの primaryGroupID 属
性の値 = グループの primaryGroupToken 属性の値であれば
プライマリー グループのメンバー)
3. 取得したメンバーがグループならメンバーを再帰的に取得
※ memberOf 属性の各値と member 属性の各値及び
distinguishedName 属性の値は次のようになっています。
例)CN=Users,CN=Builtin,DC=proceed,DC=pbyk,DC=com
10
サンプルアプリのコード(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
サンプルアプリのコード(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
詳細や関連情報はブログ等で
所属しているグループをすべて取得する
http://www.slideshare.net/mitchin227/in-rolegroup
グループのネストしているすべてのメンバーを表示する画面
http://blogs.wankuma.com/mitchin/archive/2015/02/11/508402.aspx
ForeignSecurityPrincipal クラス
http://blogs.wankuma.com/mitchin/archive/2015/02/13/508715.aspx
DirectoryAccess.GetMembers メソッド
http://blogs.wankuma.com/mitchin/archive/2015/02/15/508740.aspx
グループのネストしているすべてのメンバーを表示する画面のコード
http://blogs.wankuma.com/mitchin/archive/2015/02/18/508841.aspx
http://blogs.wankuma.com/mitchin/archive/2015/02/19/508857.aspx
http://blogs.wankuma.com/mitchin/archive/2015/02/21/508927.aspx
http://blogs.wankuma.com/mitchin/archive/2015/02/22/508949.aspx
Active Directory 関連ブログの一覧
http://www.pbyk.com/blog/bloglist.html
13

More Related Content

What's hot

Active DirectoryでDHCPを使う ~DHCPサーバーとクライアントの設定~
Active DirectoryでDHCPを使う ~DHCPサーバーとクライアントの設定~Active DirectoryでDHCPを使う ~DHCPサーバーとクライアントの設定~
Active DirectoryでDHCPを使う ~DHCPサーバーとクライアントの設定~
Michio Koyama
 
COD2012 九州会場 Active Directory 障害対策
COD2012 九州会場 Active Directory 障害対策COD2012 九州会場 Active Directory 障害対策
COD2012 九州会場 Active Directory 障害対策
wintechq
 
[AWSマイスターシリーズ] AWS SDK for Java / .NET
[AWSマイスターシリーズ] AWS SDK for Java / .NET[AWSマイスターシリーズ] AWS SDK for Java / .NET
[AWSマイスターシリーズ] AWS SDK for Java / .NET
Amazon Web Services Japan
 

What's hot (20)

Active Directory のおさらいをしましょう!~グループポリシー編~
Active Directory のおさらいをしましょう!~グループポリシー編~Active Directory のおさらいをしましょう!~グループポリシー編~
Active Directory のおさらいをしましょう!~グループポリシー編~
 
Introduction to docker
Introduction to dockerIntroduction to docker
Introduction to docker
 
Revoke-Obfuscation
Revoke-ObfuscationRevoke-Obfuscation
Revoke-Obfuscation
 
今さら聞けない! Active Directoryドメインサービス入門
今さら聞けない! Active Directoryドメインサービス入門今さら聞けない! Active Directoryドメインサービス入門
今さら聞けない! Active Directoryドメインサービス入門
 
PesterSec: Using Pester & ScriptAnalyzer to Detect Obfuscated PowerShell
PesterSec: Using Pester & ScriptAnalyzer to Detect Obfuscated PowerShellPesterSec: Using Pester & ScriptAnalyzer to Detect Obfuscated PowerShell
PesterSec: Using Pester & ScriptAnalyzer to Detect Obfuscated PowerShell
 
Ansible
AnsibleAnsible
Ansible
 
今さら聞けない! Windows Server 2016 Active Directoryドメインサービス入門
今さら聞けない!Windows Server 2016Active Directoryドメインサービス入門今さら聞けない!Windows Server 2016Active Directoryドメインサービス入門
今さら聞けない! Windows Server 2016 Active Directoryドメインサービス入門
 
Kubernetes Clusters Security with Amazon EKS (CON338-R1) - AWS re:Invent 2018
Kubernetes Clusters Security with Amazon EKS (CON338-R1) - AWS re:Invent 2018Kubernetes Clusters Security with Amazon EKS (CON338-R1) - AWS re:Invent 2018
Kubernetes Clusters Security with Amazon EKS (CON338-R1) - AWS re:Invent 2018
 
仕組みがわかるActive Directory
仕組みがわかるActive Directory仕組みがわかるActive Directory
仕組みがわかるActive Directory
 
Coffee Break NeuVector
Coffee Break NeuVectorCoffee Break NeuVector
Coffee Break NeuVector
 
AWSインスタンス設定手順書
AWSインスタンス設定手順書AWSインスタンス設定手順書
AWSインスタンス設定手順書
 
OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門OpenStackで始めるクラウド環境構築入門
OpenStackで始めるクラウド環境構築入門
 
Active DirectoryでDHCPを使う ~DHCPサーバーとクライアントの設定~
Active DirectoryでDHCPを使う ~DHCPサーバーとクライアントの設定~Active DirectoryでDHCPを使う ~DHCPサーバーとクライアントの設定~
Active DirectoryでDHCPを使う ~DHCPサーバーとクライアントの設定~
 
COD2012 九州会場 Active Directory 障害対策
COD2012 九州会場 Active Directory 障害対策COD2012 九州会場 Active Directory 障害対策
COD2012 九州会場 Active Directory 障害対策
 
Ingress on Azure Kubernetes Service
Ingress on Azure Kubernetes ServiceIngress on Azure Kubernetes Service
Ingress on Azure Kubernetes Service
 
Introduction to Version Control
Introduction to Version ControlIntroduction to Version Control
Introduction to Version Control
 
[AWSマイスターシリーズ] AWS SDK for Java / .NET
[AWSマイスターシリーズ] AWS SDK for Java / .NET[AWSマイスターシリーズ] AWS SDK for Java / .NET
[AWSマイスターシリーズ] AWS SDK for Java / .NET
 
오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기
 
Swagger 入門
Swagger 入門Swagger 入門
Swagger 入門
 
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
實現 Angular, Docker 與 Kubernetes 持續部署 (NG+2020)
 

Viewers also liked

.NETからActive Directoryデータにアクセス ~グループ情報の取得と表示~
.NETからActive Directoryデータにアクセス ~グループ情報の取得と表示~.NETからActive Directoryデータにアクセス ~グループ情報の取得と表示~
.NETからActive Directoryデータにアクセス ~グループ情報の取得と表示~
Michio Koyama
 

Viewers also liked (7)

所属しているグループをすべて取得する
所属しているグループをすべて取得する所属しているグループをすべて取得する
所属しているグループをすべて取得する
 
.NETからActive Directoryデータにアクセス ~グループ情報の取得と表示~
.NETからActive Directoryデータにアクセス ~グループ情報の取得と表示~.NETからActive Directoryデータにアクセス ~グループ情報の取得と表示~
.NETからActive Directoryデータにアクセス ~グループ情報の取得と表示~
 
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメ
 
Redmineサーバ統合事例
Redmineサーバ統合事例Redmineサーバ統合事例
Redmineサーバ統合事例
 
開発環境の認証を改善して Redmineを社内標準にした話
開発環境の認証を改善して Redmineを社内標準にした話開発環境の認証を改善して Redmineを社内標準にした話
開発環境の認証を改善して Redmineを社内標準にした話
 
講演1 redmineの簡易crmとしての活用事例r2
講演1 redmineの簡易crmとしての活用事例r2講演1 redmineの簡易crmとしての活用事例r2
講演1 redmineの簡易crmとしての活用事例r2
 
Redmineでメトリクスを見える化する方法
Redmineでメトリクスを見える化する方法Redmineでメトリクスを見える化する方法
Redmineでメトリクスを見える化する方法
 

More from Michio Koyama

Active Directoryドメインを作ってみよう ~ドメインコントローラーの追加~
Active Directoryドメインを作ってみよう ~ドメインコントローラーの追加~Active Directoryドメインを作ってみよう ~ドメインコントローラーの追加~
Active Directoryドメインを作ってみよう ~ドメインコントローラーの追加~
Michio Koyama
 
.NETからActive Directoryにアクセス
.NETからActive Directoryにアクセス.NETからActive Directoryにアクセス
.NETからActive Directoryにアクセス
Michio Koyama
 

More from Michio Koyama (13)

Active Directoryドメインを作ってみよう ~ドメインコントローラー追加後の設定~
Active Directoryドメインを作ってみよう ~ドメインコントローラー追加後の設定~Active Directoryドメインを作ってみよう ~ドメインコントローラー追加後の設定~
Active Directoryドメインを作ってみよう ~ドメインコントローラー追加後の設定~
 
Active Directoryドメインを作ってみよう ~ドメインコントローラーの追加~
Active Directoryドメインを作ってみよう ~ドメインコントローラーの追加~Active Directoryドメインを作ってみよう ~ドメインコントローラーの追加~
Active Directoryドメインを作ってみよう ~ドメインコントローラーの追加~
 
Active Directoryドメインを作ってみよう ~ユーザーやグループの作成とPCのドメイン参加~
Active Directoryドメインを作ってみよう ~ユーザーやグループの作成とPCのドメイン参加~Active Directoryドメインを作ってみよう ~ユーザーやグループの作成とPCのドメイン参加~
Active Directoryドメインを作ってみよう ~ユーザーやグループの作成とPCのドメイン参加~
 
Active Directoryドメインを作る準備 ~AD DSとDNSサーバーのインストール~
Active Directoryドメインを作る準備 ~AD DSとDNSサーバーのインストール~Active Directoryドメインを作る準備 ~AD DSとDNSサーバーのインストール~
Active Directoryドメインを作る準備 ~AD DSとDNSサーバーのインストール~
 
ユーザの LockoutTime 属性の値の確認
ユーザの LockoutTime 属性の値の確認ユーザの LockoutTime 属性の値の確認
ユーザの LockoutTime 属性の値の確認
 
Active Directoryに公開したプリンタを解除
Active Directoryに公開したプリンタを解除Active Directoryに公開したプリンタを解除
Active Directoryに公開したプリンタを解除
 
.NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~
.NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~.NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~
.NETからActive Directoryデータにアクセス ~共有フォルダ情報の取得と表示~
 
Move the added printer to specific OU
Move the added printer to specific OUMove the added printer to specific OU
Move the added printer to specific OU
 
.NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~
.NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~.NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~
.NETからActive Directoryデータにアクセス ~プリンタ情報の取得と表示~
 
Active Directory Security Descriptor ADSI - .Net
Active Directory Security Descriptor ADSI - .NetActive Directory Security Descriptor ADSI - .Net
Active Directory Security Descriptor ADSI - .Net
 
Active Directoryデータの Security Descriptor
Active Directoryデータの Security DescriptorActive Directoryデータの Security Descriptor
Active Directoryデータの Security Descriptor
 
Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"Active Directoryデータの "大きい整数"
Active Directoryデータの "大きい整数"
 
.NETからActive Directoryにアクセス
.NETからActive Directoryにアクセス.NETからActive Directoryにアクセス
.NETからActive Directoryにアクセス
 

グループのメンバーをすべて取得する