在其他有效搜索之后,Active Directory userAccountControl为null

时间:2013-11-08 17:52:57

标签: c# active-directory user-accounts accounts

感谢阅读。

我尝试了以下代码的许多变体,并且都返回了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吗?搜索结构不正确?

2 个答案:

答案 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!” :)