如何在Active Directory中判断userAccountControl特定复选框状态
解决Active Directory中userAccountControl复选框状态判断问题
首先得明确:userAccountControl是一个位掩码属性,每个复选框对应一个独立的二进制位,不能直接看整体数值,而是要通过位与运算来判断特定位是否被置位(也就是复选框是否勾选)。
你拿到的512是NORMAL_ACCOUNT(普通用户账户)的标志位,这是普通AD用户的默认值,所以不管你要判断的那个复选框状态如何,这个位始终会被置位,导致整体数值里一直包含512。
具体解决步骤:
确定目标复选框对应的位常量
每个AD用户属性的复选框都对应一个固定的位值,比如常见的:- 账户禁用:
ACCOUNTDISABLE= 2 - 用户不能更改密码:
PASSWD_CANT_CHANGE= 64 - 密码永不过期:
DONT_EXPIRE_PASSWORD= 65536 - 账户锁定:
LOCKOUT= 16
你需要先确认你要判断的那个复选框对应的具体位值(可通过AD属性说明或官方文档的userAccountControl常量列表确认)。
- 账户禁用:
修改代码加入位判断逻辑
拿到userAccountControl的数值后,和目标位值做位与运算,结果非零则表示该复选框已勾选:VARIANT var; VariantInit(&var); hr = pUsr->Get(CComBSTR("userAccountControl"), &var); if (SUCCEEDED(hr)) { DWORD uacValue = V_I4(&var); std::cout << "userAccountControl值:" << uacValue << std::endl; // 替换成你要判断的复选框对应的位值,这里用65536(密码永不过期)举例 const DWORD TARGET_FLAG = 65536; if ((uacValue & TARGET_FLAG) != 0) { std::cout << "目标复选框已勾选" << std::endl; } else { std::cout << "目标复选框未勾选" << std::endl; } } VariantClear(&var); // 别忘了释放VARIANT资源注意事项
- 必须调用
VariantClear(&var)释放资源,避免内存泄漏 - 如果不确定目标位值,可以先修改代码输出二进制形式的
uacValue,对比复选框勾选前后的二进制变化,找到对应的位
- 必须调用
内容的提问来源于stack exchange,提问作者hariharan baskaran
相关产品推荐
相关产品推荐

