我正在尝试使用.NET System.DirectoryServices.Protocol名称空间进行LDAP身份验证。 (这是必要的,因为我根本无法使用System.DirectoryServices获取现有代码来与客户端的LDAP服务器通信。)

我设法使一切正常,但当我尝试返回用户帐户的userAccountControl属性时,它正在返回值的字符串表示形式,而应该返回整数。 (Active Directory中的值肯定是整数。)

在以下代码中,如果我在userAccountFlags = (int)attrib[0];处断点,则attrib[0]的类型为字符串。为什么?

(我可以很容易地通过用int.TryParse((string)attrib[0], out userAccountFlag);替换它来“修复”它,但是比起使用这种解决方法,我更想知道为什么会这样。)

var ident = new LdapDirectoryIdentifier(domain, (ssl ? 636 : 389));
using (var conn = new LdapConnection(ident))
{
    conn.Credential = new NetworkCredential(domainUsername, domainPassword);
    conn.AuthType = AuthType.Basic;
    if (ssl)
    {
        conn.SessionOptions.SecureSocketLayer = true;
        conn.SessionOptions.VerifyServerCertificate = (connection, certificate) => true;
    }
    conn.Bind();

    var request = new proto.SearchRequest(rootDN, testDN, SearchScope.Subtree);
    request.Attributes.Add("userAccountControl");
    request.SizeLimit = 1;

    var response = (SearchResponse)conn.SendRequest(request);
    if (response.Entries.Count != 0)
    {
        int userAccountFlags = int.MinValue;
        foreach (proto.SearchResultEntry entry in response.Entries)
        {
            foreach (proto.DirectoryAttribute attrib in entry.Attributes.Values)
            {
                if (attrib.Name == "userAccountControl" && attrib.Count > 0)
                {
                    // The following line breaks, as "attrib[0] is string = true"
                    userAccountFlags = (int)attrib[0];
                    break;
                }
            }
        }
    }
}

最佳答案

从属性返回的值将始终是字符串或字节数组。

DirectoryAttribute indexer的文档中:


  Item的Get方法始终尝试将值对象转换为字符串并返回;否则返回一个字节数组。

10-06 16:19