web-dev-qa-db-ja.com

DirectoryServicesを使用してC#からLDAPに接続する

LDAPを実行しているedirectory 8.8サーバーに接続しようとしています。 .Netでそれを行うにはどうすればよいですか? DirectoryEntryやDirectorySearcherなどのSystem.DirectoryServiceのクラスを引き続き使用できますか、それともAD固有ですか? 「接続文字列」を別の方法で指定する必要がありますか?

以下のコードのようなものを試していますが、うまくいかないようです...

DirectoryEntry de = new DirectoryEntry ("LDAP://novellBox.sample.com","admin","password",AuthenticationTypes.None);
DirectorySearcher ds = new DirectorySearcher(de);
var test = ds.FindAll();

何か案は?

13
Chaitanya

まあ、私はあなたの接続文字列が少し欠けていると思います-サーバー名だけを指定するだけでは十分ではありません-検索の「開始点」も指定する必要があります。

ADでは、これは通常、ドメイン内の「ユーザー」コンテナのようなものであり、LDAP用語では次のように指定します。

LDAP://novellBox.sample.com/cn=Users,dc=YourCompany,dc=com

EDirectoryの新しいバージョンがどのようにLDAPに準拠しているかはわかりませんが、理論的には実装に関係なく標準のLDAPであるため、これは機能するはずです:-)

しかし、再び:理論的にのみ、理論と実践の間に違いはありません.....

低レベルのLDAP呼び出しを直接提供するSystem.DirectoryServices.Protocols名前空間もあります。これはADにまったく関連付けられていませんが、実際には非常に低レベルです。

Novell C#LDAPライブラリ もありますが、試したことがなく、その完成度や能力については言えません。しかし、それはあなたにいくつかの手掛かりを与えるかもしれません!

また、この他の Stackoverflow質問 Novell、LDAP、およびC#についても参照してください。追加情報が表示される場合があります。

13
marc_s

私はこれを理解するのに苦労しましたが、次のようなものを使うことができました、それは私にとってはうまくいきました:

Domain domain = Domain.GetDomain(new DirectoryContext(DirectoryContextType.Domain, "novellBox.sample.com");
DirectorySearcher ds = new DirectorySearcher(domain.GetDirectoryEntry(), searchQuery);
using (SearchResultCollection src = ds.FindAll())
{....}
5
Fermin

ホストにはLDAP構文を使用する必要があると思います。

usingとの接続を解放することを忘れないでください。ディレクトリエントリを破棄しないと、プールが不足してアプリが壊れるまで、ディレクトリエントリが永久にハングアップします。

using (DirectoryEntry de = new DirectoryEntry ("LDAP://CN=server,DC=domain,DC=com","admin","password",AuthenticationTypes.Secure))
{
    ...
}
4
wefwfwefwe

ディレクトリサーバーの構成によっては、実際にはSystem.DirectoryServices.Protocols名前空間を使用する必要がある場合があります。 OpenLDAPへの接続に関する投稿を書きました。

http://mikemstech.blogspot.com/2013/03/searching-non-Microsoft-ldap.html

2
Mike Burr

外部LDAPがDNによる認証を必要とする場合は、これを試してください。最初にユーザーのDNを取得してから、DNとユーザー資格情報による認証を試してください。ドミノLDAPでテストしました。

// Autheticate in external LDAP
string ldapserver = "10.1.1.1:389";
string ldapbasedn = "o=mycompany";
string ldapuser = "cn=Administrator,o=mycompany";
string ldappassword = "adminpassword";
string ldapfilter = "(&(objectclass=person)(cn={0}))";

string user = "usertest";
string password = "userpassword";
try
{
    string DN = "";
    using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + ldapserver + "/" + ldapbasedn, ldapuser, ldappassword, AuthenticationTypes.None))
    {
        DirectorySearcher ds = new DirectorySearcher(entry);
        ds.SearchScope = SearchScope.Subtree;
        ds.Filter = string.Format(ldapfilter, user);
        SearchResult result = ds.FindOne();
        if (result != null )
        {
            DN = result.Path.Replace("LDAP://" + ldapserver + "/" , "");
        }
    }
    // try logon   
    using (DirectoryEntry entry = new DirectoryEntry("LDAP://" + ldapserver + "/" + ldapbasedn, DN, password, AuthenticationTypes.None))
    {
        DirectorySearcher ds = new DirectorySearcher(entry);
        ds.SearchScope = SearchScope.Subtree;
        SearchResult result = ds.FindOne();
    }
} catch (Exception) { }
1
Renzo Ciot

LDAPを実行しているedirectory 8.8サーバーに接続しようとしています。 .Netでそれを行うにはどうすればよいですか? DirectoryEntryやDirectorySearcherなどのSystem.DirectoryServiceのクラスを引き続き使用できますか、それともAD固有ですか?

Microsoft Active DirectoryのSystem.DirectoryServices、Linuxで動作するOpenLDAP、およびeDirectiryを問題なく使用しています。答えは「はい」です。これらのクラスを使用してeDirにアクセスできます。

「接続文字列」を別の方法で指定する必要がありますか?

はい、そうです。 DirectoryEntryに「LDAP://」で始まる文字列を渡す場合、URI構文とは非常に異なるLDAP構文に準拠する必要があります。

ルートオブジェクトへの正しいパスを取得するために、LDAPブラウザー(google it、多くの無料ダウンロードがあります)を使用することをお勧めします。そうしないと、正しいオブジェクトタイプを理解することに時間を費やすことになります。

1
Joshua