6

LDAPSを使用してLDAPサーバーに接続する必要があるため、DirectoryEntryの代わりにLdapConnectionを使用する必要があります。

ソースコードは次のとおりです。

        SearchResponse response;
        using (LdapConnection con = new LdapConnection(new LdapDirectoryIdentifier(Host, Port)))
        {
            if (IsSSL)
            {
                con.SessionOptions.SecureSocketLayer = true;
                con.SessionOptions.VerifyServerCertificate =
                    (connection, certificate)
                    => true;
            }
            con.Credential = new NetworkCredential(_username, _password);
            con.AuthType = AuthType.Basic;
            con.Bind();

            if (logMessage != null)
                logMessage("Connected to LDAP");

            string sFilter = String.Format(
                "(&(objectcategory=person)(objectclass=user){0}(!(userAccountControl:1.2.840.113556.1.4.803:=2)))",
                filter
                );

            SearchRequest request = new SearchRequest("OU=Corp,DC=mydc,DC=com", sFilter, SearchScope.Subtree);
            request.Attributes.Add(Resources.objectguid);
            request.Attributes.Add(Resources.givenname);
            request.Attributes.Add(Resources.sn);
            request.Attributes.Add(Resources.initials);
            request.Attributes.Add(Resources.samaccountname);
            request.Attributes.Add(Resources.userprincipalname);
            request.Attributes.Add(Resources.mail);
            request.Attributes.Add(Resources.objectsid);
            request.Attributes.Add(Resources.department);
            request.Attributes.Add(Resources.company);
            request.SizeLimit = 10;

            response = (SearchResponse) con.SendRequest(request);
        }

ソースコードを実行すると(外部のサードパーティソフトウェアを使用して、資格情報、ホスト、ポートなどを確認しました)、次の例外が発生します。

サイズ制限を超えました

説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーとそれがコードのどこで発生したかについての詳細は、スタックトレースを確認してください。

例外の詳細:System.DirectoryServices.Protocols.DirectoryOperationException:サイズ制限を超えました

ソースエラー:

response = (SearchResponse) con.SendRequest(request);
[DirectoryOperationException: The size limit was exceeded]
   System.DirectoryServices.Protocols.LdapConnection.ConstructResponse(Int32

messageId、LdapOperation操作、ResultAll resultType、TimeSpan requestTimeOut、ブール値exceptionOnTimeOut)+2385 System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request、TimeSpan requestTimeout)+499 System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request)+50 UserSearchProvider .ADUserSearchProvider.QueryStore(UserSearchCriteriaCollection基準、アクション1 logMessage) in c:\Users\stemarie\Documents\Visual Studio 2012\Projects\Idealink.Modules\UserSearchProvider\UserSearchProvider\ADUserSearchProvider.cs:298 UserSearchProvider.UserSearchProvider.QueryAndSort(UserSearchCriteriaCollection criterias, Action1 logMessage)c:\ Users \ stemarie \ Documents \ Visual Studio 2012 \ Projects \ Idealink.Modules \ UserSearchProvider \ UserSearchProvider \ UserSearchProvider.cs:77 UserSearchProvider.UserSearchProvider.Search(UserSearchCriteriaCollection基準、アクション1 logMessage) in c:\Users\stemarie\Documents\Visual Studio 2012\Projects\Idealink.Modules\UserSearchProvider\UserSearchProvider\UserSearchProvider.cs:33 UserSearchProvider.UserSearchService.Search(UserSearchCriteriaCollection criterias, Action1 logMessage)in c:\ Users \ stemarie \ Documents \ Visual Studio 2012 \ Projects \ Idealink.Modules \ UserSearchProvider \ UserSearchProvider \ UserSearchService.cs:44 UserSearchProviderTest._Default.Page_Load(Object sender、EventArgs e)in c:\ Users \ stemarie \ Documents \ Visual Studio 2012 \ Projects \ Idealink.Modules \ UserSearchProvider \ UserSearchProviderTest \ Default.aspx.cs:28

私を混乱させる部分は、最大サイズ制限を指定したことです。100を超えるエントリは必要ありません。制限したいのですが、ただし、SizeLimitを1に指定しても、ライブラリは常にエラーをスローします。

この問題に関する洞察/提案はありますか?私たちはこれを機能させることに非常に近づいており、この最後の問題を解決する必要があります。

4

2 に答える 2

1

結局のところ、これは機能します:

            try
            {
                response = (SearchResponse)con.SendRequest(request);

                return response.Entries.Cast<SearchResultEntry>()
                    .Select(entry => entry.Attributes)
                    .Select(x => GetADUserSearchItemFromADProperties(x, logMessage))
                    .Where(user => user.HasName)
                    .Cast<IUserSearchItem>();
            }
            catch (DirectoryOperationException ex)
            {
                response = (SearchResponse) ex.Response;
                return response.Entries.Cast<SearchResultEntry>()
                    .Select(entry => entry.Attributes)
                    .Select(x => GetADUserSearchItemFromADProperties(x, logMessage))
                    .Where(user => user.HasName)
                    .Cast<IUserSearchItem>();
            }

MSDN のドキュメントには、DirectoryOperationException.Response プロパティとしてDirectoryResponseクラスを取得すると記載されています。ただし、このプロパティをSearchResponseタイプにキャストしてから、SearchResponse.Entries プロパティを使用して、指定した SizeLimit に達する前に受け取ったエントリを取得できます。

私はこれを試してみましたが、期待どおりの結果が得られました。操作を実行するために例外を処理する必要があることに少し動揺しています。

于 2012-11-26T18:48:19.327 に答える