15

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

何か案は?

4

6 に答える 6

14

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

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

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

eDirectoryの新しいバージョンがどの程度LDAPに準拠しているかはわかりませんが、理論的には、実装に関係なく標準のLDAPであるため、動作するはずです:-)

しかし、繰り返しになりますが、理論上のみ、理論と実践の間に違いはありません.....

低レベルの LDAP 呼び出しを直接提供する名前空間もありSystem.DirectoryServices.Protocolsます。これは AD とはまったく関係ありませんが、実際にはかなり低レベルです.....

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

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

于 2009-09-17T07:55:16.393 に答える
6

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

Domain domain = Domain.GetDomain(new DirectoryContext(DirectoryContextType.Domain, "novellBox.sample.com");
DirectorySearcher ds = new DirectorySearcher(domain.GetDirectoryEntry(), searchQuery);
using (SearchResultCollection src = ds.FindAll())
{....}
于 2009-09-17T07:41:04.480 に答える
4

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

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

using (DirectoryEntry de = new DirectoryEntry ("LDAP://CN=server,DC=domain,DC=com","admin","password",AuthenticationTypes.Secure))
{
    ...
}
于 2009-09-17T07:39:26.433 に答える
3

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

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

于 2013-03-07T18:35:11.767 に答える
1

外部 LDAP で DN による認証が必要な場合は、これを試してください。最初にユーザーの DN を取得してから、DN とユーザー資格情報を使用して認証を試みます。Domino 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) { }
于 2013-06-13T11:00:29.853 に答える
1

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

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

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

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

ルート オブジェクトへの正しいパスを取得するために、LDAP ブラウザを使用することをお勧めします (Google で検索してください。無料でダウンロードできます)。そうしないと、正しいオブジェクト タイプを特定するのに時間がかかります。

于 2010-06-22T19:44:34.463 に答える