并感谢您的阅读。
我尝试了以下代码的许多变体,并且都为 userAccountControl 属性返回了一个空值:
DirectoryEntry de = new DirectoryEntry("LDAP://{my server/domain}");
DirectorySearcher ds= new DirectorySearcher(de);
ds.Filter = "(&(objectClass=user)(objectGUID=" + queryGUID + "))";
ds.PropertiesToLoad.Add("userAccountControl");
foreach (SearchResult sr in ds.FindAll())
{
var userFlags = sr.GetDirectoryEntry().Properties["userAccountControl"].Value;
int flags = (int)userFlags;
bool enabled = (flags & 0x2) == 0x2;
Console.WriteLine("Enabled: {0}", enabled ? "true" : "false");
}
目前它正在使用我从有效用户那里检索到的 objectGuid 进行过滤,并将其转换为正确的形式。(作为一个测试程序,我不关心字符串连接......我稍后会在生产代码中修复它。)我可以(并且拥有)使用(d)其他搜索过滤器值,包括按位传递过滤器。我使用了直接绑定与目录搜索。我已经写了十几个或更多的变体,结果都一样:查询成功,但 userFlags 属性本身返回 null(不存在)。
由于我在这里专门要求一个用户类,我知道我不是无意中获得了一个联系人类(它没有 userAccountControl 属性)。代码中显示的按位运算并不重要(我知道我可以转换为枚举并以这种方式进行比较)。无论如何,它在按位运算之前因空引用异常而崩溃。
这是在 Windows Server 2008 R2 上运行的,使用 .NET 4(我知道 .NET 4.5 和 AD 帐户管理的问题)。运行它的帐户同时具有管理员和企业管理员权限。另外,顺便说一句,我下载了 Softerra 的 LDAP 管理员控制台,它也没有显示这个属性。
我的问题很简单,为什么这个值是空的?不应该,据我所知有限。也许我一开始没有正确设置AD?搜索结构不正确?