我正在尝试使用.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方法始终尝试将值对象转换为字符串并返回;否则返回一个字节数组。