前回、ブラウザから Active Directory に接続しました。
今作ってるサンプルアプリは
・Windows フォーム(.NET 4 Client Profile)
・Web フォーム(.NET 4)
・クラスライブラリ(.NET 4 Client Profile)
の3プロジェクトという構成です。
ということで、Windows アプリからも Web アプリからも使えるように、クラスライブラリに Active Directory のオブジェクトにアクセスするための静的メソッド・プロパティを提供するクラスを実装しています。
まずは System.DirectoryServices アセンブリの参照を追加します。
名前空間 System.DirectoryServices と System.DirectoryServices.ActiveDirectory をインポートします。
クラスは
VB
Public NotInheritable Class DirectoryAccess
C#
public static class DirectoryAccess
ドメインを取得するメソッドは次のように実装してます。(関連部分のみ)
VB
Public Shared Function GetDomain() As Domain
Return Domain.GetComputerDomain()
End Function
C#
public static Domain GetDomain()
{
return Domain.GetComputerDomain();
}
内部実装は Domain.GetComputerDomain メソッドを呼んでるだけです。
Domain クラスには Domain オブジェクトを取得する静的メソッドが3つあって、他に Domain.GetCurrentDomain メソッドと Domain.GetDomain メソッドがあります。
サンプルアプリは Windows アプリと Web アプリの両方から使うので、
1. クライアントPCと Webサーバがアクセスする
2. アクセスするコンピュータはドメインのメンバになっているという想定(しかも単一のドメイン)
3. ドメインにログオンしていてもしていなくても(ローカルログオンでも)同じように使いたいなぁ(<-- 自分の環境w)
ということで、Domain.GetComputerDomain メソッドを呼んでます。
※今後、ユーザやグループなどのオブジェクトの検索や変更を行う際に支障が出るようなら変更します。
ヘルプを見ると、
Domain.GetComputerDomain メソッドは、
ローカル コンピューターが参加しているドメインを表す Domain オブジェクトを取得します。
Domain.GetCurrentDomain メソッドは、
アプリケーションを実行しているセキュリティ コンテキストの実際の現在のユーザー資格情報に対応する Domain オブジェクトを取得します。
Domain.GetDomain メソッドは、
指定したコンテキストの Domain オブジェクトを取得します。
となっています。
Domain.GetDomain メソッドを使う場合はこんな感じで実装します。
VB
Dim context As New DirectoryContext(DirectoryContextType.Domain)
Return Domain.GetDomain(context)
C#
var context = new DirectoryContext(DirectoryContextType.Domain);
return Domain.GetDomain(context);
これは、現在のユーザコンテキストの資格情報でディレクトリにアクセスして Domain オブジェクトを取得します。