質問
Active Directory を使用して Windows 認証に対して実行されている Web アプリケーションがあります。Active Directory エントリから個人情報を取得するという新しい要件があります。この情報にアクセスする最も簡単な方法は何でしょうか?
解決
DirectoryEntry を通じてユーザーに直接アクセスするのが、最も簡単なアプローチのように思えます。ここでは、私が最初の AD 関連プロジェクトから学んだ AD 関連の豆知識をいくつか紹介します。
- URI では、LDAP を小文字で記述します。そうしないと、謎のエラーが発生します。この憂鬱な問題に一日以上費やしました...
- 単一値のプロパティをクリアするには、それを null ではなく空の文字列に設定します。Null は例外を引き起こします。
- 複数値のプロパティをクリアするには、 DirectoryEntry.Property.Clear() 方法。
- Active Directory スキーマ リファレンスには、値がどのデータ型であるか、およびそれが複数値であるか単一値であるかが記載されています。
- Directoryentry に対して手動で RefreshCache() を実行する必要はありませんが、RefreshCache() を使用してキャッシュするプロパティを指定する場合は、今後他のプロパティは自動取得されないことに注意してください。
- COMException は、System.DirectoryServices のクラスを使用するときはいつでもスローされる可能性があります。これらの try ブロックに注目してください。何も安全だと思わないでください。
ユーザーのパスがわからない場合は、おそらく DirectorySearcher を使用してユーザーのディレクトリ エントリを取得する必要があります (ユーザーがログインしているだけではわかりません)。使用は非常に簡単でしたが、LDAP 構文の癖に注意してください。つまり、非 ASCII (およびその他の?) 文字をエンコードする必要があります。使用する検索文字列はおそらく次のようになります。 (&(sAMAccountName=何でも)(クラス=ユーザー)). 。これは私の思いつきであり、少し間違っている可能性があります。
の Active Directory スキーマのリファレンス 役に立つでしょう。スキーマは変更および拡張できることを理解してください (例:Exchange をインストールすると、メールボックス情報がユーザーに追加されます)。
AD エクスプローラー は、デバッグや低レベルの AD データ管理に使用できる便利なツールです。これは、設定したいプロパティはわかっているが、AD 管理ツールで適切なダイアログ ボックスが見つからない場合に便利であることがわかりました。
他のヒント
次のスニペットが入門として役立つかもしれません。
public static bool IsUserInGroup(string lanid, string group)
{
DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPPATH);
if(entry != null)
{
entry.Username=@"LDAPUSER";
entry.Password="LDAPPASSWORD";
DirectorySearcher srch = new DirectorySearcher(entry);
srch.Filter = String.Format("(&(objectClass=person)(sAMAccountName={0}))", lanid);
srch.PropertiesToLoad.Add("memberOf");
SearchResult result = srch.FindOne();
if(result != null)
{
if(result.Properties.Contains("memberOf"))
{
string lookfor = String.Format("cn={0},", group.ToLower());
foreach(string memberOf in result.Properties["memberOf"])
{
if(memberOf.ToLower().StartsWith(lookfor))
return true;
}
}
}
return false;
}
throw new Exception(String.Format("Could not get Directory lanid:{0}, group{1}", lanid, group));
}
非常に良い参考資料: 方法:C# 経由の Active Directory 内の(ほぼ)すべて
System.DirectoryServices 名前空間を見てください。
標準の LDAP ライブラリを使用して Active Directory サーバーから情報を取得しましたが、必要なデータが LDAP サーバーのスキーマ経由で利用できることを確認する必要があります。一般に、InetOrganizationalperson に保存されているあらゆる情報と、そのユーザーが属するグループに関連するほとんどの情報を取得できます。