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

1

我知道这是一个老问题,但是由于我对同一件事绞尽脑汁,所以我认为对于已经走到这一步的任何人来说,这都是值得的……

问题在于 DirectoryServices 缓存架构的方式,如果它尝试加载自定义属性(DirectoryServices 通过其连接的域不熟悉的任何属性)(专门针对 Windows 8/2012 的修补程序)

它实际上记录在知识库文章 http://support.microsoft.com/kb/2802148中,其中还包括应该解决您的问题的修补程序(如果您还没有解决它)

于 2015-03-03T21:33:40.657 回答
0

这有可能在两个不同的虚拟机上以不同的用户身份运行吗?在哪种情况下可能存在权限问题?您在第二个 VM 上的用户是否具有足够的权限?

于 2013-04-07T02:29:06.350 回答