0

并感谢您的阅读。

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

4

2 回答 2

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;
        }
    }
}

我使用这个代码块。我试过了,在活动目录中设置禁用用户后。它必须正常工作。

于 2013-11-09T15:14:10.677 回答
1

找到了。事实证明,新用户属性受到保护,只能由以管理员身份运行的代码(“运行方式”)访问。我最初并没有使用提升的权限运行此代码。一旦我这样做了,属性就会出现。这似乎与查询墓碑对象的行为相似。我只能说“Doh!” :)

于 2014-02-04T14:11:15.360 回答