1

奇妙なことが起こる...

新しい開発者マシン (Windows Server 2008 R2 から 2012) に移動することを余儀なくされました。まったく同じコードは、新しいマシンでは機能しません。

public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
{
    MembershipUserCollection retvalue = new MembershipUserCollection();

    string ldapConnectionString = _configuration.GetConnectionString();

    using (DirectoryEntry de
        = new DirectoryEntry(ldapConnectionString, _configuration.SearchAccount, _configuration.SearchAccountPassword, AuthenticationTypes.ServerBind))
    {
        string filter = string.Format("(&(objectClass=Person)(CUSTOMemail={0}))", emailToMatch);

        DirectorySearcher ds = new DirectorySearcher(de, filter, new[] { "cn", "CUSTOMemail" }, SearchScope.Subtree);
        SearchResultCollection collection = ds.FindAll();

        totalRecords = collection.Count;

        int pagesCount = (totalRecords > pageSize) ? (int)Math.Ceiling((double)(totalRecords / pageSize)) : 1;

        if (pageIndex > pagesCount - 1)
            throw new IndexOutOfRangeException("PageIndex exceeds max PageIndex");

        for (int i = pageIndex * pageSize; i < totalRecords; i++)
        {
            DirectoryEntry userDirectoryEntry = collection[i].GetDirectoryEntry();

            string userName = userDirectoryEntry.Properties["cn"].Value as string;
            string providerUserKey = userDirectoryEntry.Path;
            string email = userDirectoryEntry.Properties["CUSTOMemail"].Value as string;

            MembershipUser mu = new MembershipUser(
                providerName: Name,
                name: userName,
                providerUserKey: providerUserKey,
                email: email,
                passwordQuestion: null,
                comment: null,
                isApproved: true,
                isLockedOut: false,
                creationDate: DateTime.MinValue,
                lastLoginDate: DateTime.MinValue,
                lastActivityDate: DateTime.MinValue,
                lastPasswordChangedDate: DateTime.MinValue,
                lastLockoutDate: DateTime.MinValue);

            retvalue.Add(mu);
        }
    }

    return retvalue;
}

CUSTOMemail プロパティを読み取ろうとすると、コードは失敗します。システム プロパティ (「cn」など) が機能します。

IIS の設定はまったく同じですが、バインディング プロセスが機能するため、これは問題ではありません。ドメイン メンバーシップ (私はそれについてさまざまなスレッドを読みました) は変更されておらず、重要ではありません。

プロパティをフィルター処理して (上記を参照)、すべてのプロパティの名前を表示できます。ネットワーク トレースは、プロパティその値がネットワーク経由で送信されることを示しているため、必要なものはすべてそこにあります。また、JXplorer のような LDAP エクスプローラーを使用すると、完全な DirectoryEntry (値を含む) が表示されます。しかし、私の C# コードはうまくいきません。ある仮想マシンで機能し、他の仮想マシンでは機能しない理由について、私は完全に困惑しています。

すべてのデータがネットワーク経由で送信されるという事実に興味をそそられます (したがって、ここではディレクトリにパーミッションの問題はまったくありません) が、私の C# コードはそこから値を抽出できません :(

4

2 に答える 2