質問

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));
}

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

System.DirectoryServices 名前空間

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top