感谢阅读。
我尝试了以下代码的许多变体,并且都返回了userAccountControl属性的null值:
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吗?搜索结构不正确?
答案 0 :(得分:1)
您的代码是否找到了用户?如果这是真的可以试试吗?
//...
var results = ds.FindAll();
foreach (SearchResult sResult in results)
{
var directoryEntry = sResult.GetDirectoryEntry();
using (directoryEntry)
{
bool enabled;
const string attrib = "userAccountControl";
const int ufAccountDisable = 0x0002;
de.RefreshCache(new string[] { attrib });
var flags =(int)de.Properties[attrib].Value;
if (((flags & ufAccountDisable) == ufAccountDisable))
{
enabled = false;
}
else
{
enabled true;
}
}
}
我使用此代码块。在设置禁用活动目录中的用户后,我尝试了它。它必须正常工作。
答案 1 :(得分:1)
找到它。事实证明,新的用户属性受到保护,只能由以管理员身份运行的代码(“运行方式”)访问。我最初并没有使用提升权限运行此代码。一旦我做了,属性出现了。这似乎与查询逻辑删除的对象类似。我只能说“Doh!” :)