10

Active Directory を使用して Windows 認証に対して実行されている Web アプリケーションがあります。Active Directory エントリから個人情報を取得するという新しい要件があります。この情報にアクセスする最も簡単な方法は何ですか?

4

5 に答える 5

17

DirectoryEntry を介してユーザーに直接アクセスするのが、最も簡単な方法のようです。最初の AD 関連のプロジェクトから学んだ、AD 関連の情報をいくつか紹介します。

  • URI では、LDAP を小文字で記述します。そうしないと、謎のエラーが発生します。私はこの気のめいるような問題に 1 日以上を費やしました...
  • 単一値のプロパティをクリアするには、null ではなく空の文字列に設定します。Null は例外を引き起こします。
  • 複数値のプロパティをクリアするには、DirectoryEntry.Property.Clear()メソッドを使用します。
  • Active Directory スキーマ リファレンスには、値がどのデータ型になるか、および複数値か単一値かが示されます。
  • Directoryentry で手動で RefreshCache() を実行する必要はありませんが、これを使用してキャッシュするプロパティを指定する場合は、将来、他のプロパティが自動的に取得されないことに注意してください。
  • System.DirectoryServices のクラスを使用すると、いつでも COMException がスローされる可能性があります。これらの try ブロックに注目してください。何でも安全だと思い込まないでください。

ユーザーのディレクトリ エントリのパスがわからない場合は、おそらく DirectorySearcher を使用してそのディレクトリ エントリを取得する必要があります (ユーザーをログインさせるだけでは、そのようなことはありません)。使い方はかなり簡単ですが、LDAP 構文の癖に注意してください。つまり、非 ASCII (およびその他の?) 文字をエンコードする必要があります。使用する検索文字列は、おそらく(&(sAMAccountName=whatever)(class=user))のようなものになります。これは私の頭のてっぺんから外れており、少し間違っている可能性があります。

Active Directory スキーマ リファレンスが役立ちます。スキーマは変更および拡張できることを理解しておいてください (たとえば、Exchange をインストールすると、メールボックス情報がユーザーに追加されます)。

AD Explorerは、デバッグや低レベルの AD データ管理に使用できる便利なツールです。設定するプロパティはわかっているが、AD 管理ツールで適切なダイアログ ボックスが見つからない場合に便利です。

于 2008-09-25T09:35:09.367 に答える
5

次のスニペットは、スターターとして役立つ場合があります。

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));
}
于 2008-09-25T09:37:12.700 に答える
5

非常に良いリファレンス: Howto: (Almost) Everything in Active Directory via C#

于 2008-09-25T09:44:55.817 に答える
1

System.DirectoryServices 名前空間を見てください。

System.DirectoryServices 名前空間

于 2008-09-25T09:23:45.777 に答える
0

標準の LDAP ライブラリを使用して Active Directory サーバーから情報を取得しましたが、必要なデータが LDAP サーバーのスキーマを介して利用可能であることを確認する必要があります。一般に、InetOrganizationalPerson に格納されているすべての情報と、それらが属するグループに関連するほとんどの情報を取得できます。

于 2008-09-25T09:20:55.360 に答える