AdjustTokenPrivileges:成功后ERROR_NOT_ALL_ASSIGNED

时间:2018-04-23 01:00:52

标签: c++ windows winapi visual-c++ privileges

我的代码有一个循环,它使用AdjustTokenPrivileges来启用SE_DEBUG_NAME权限并将其删除。 每次运行它时,第一组启用/禁用成功,但在第一个循环之后,其余的启用/删除组为AdjustTokenPrivileges提供ERROR_NOT_ALL_ASSIGNED。 机器是Windows 10 pro 64bit。编译的exe在“以管理员身份运行”模式下运行。 请帮助。

以下代码处于循环中。

TOKEN_PRIVILEGES priv = { 0,0,0,0 };
HANDLE hToken = NULL;
LUID luid = { 0,0 };
BOOL Status = true;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) {
    Status = false;
    goto EXIT;
}
if (!LookupPrivilegeValueW(0, lpszPrivilege, &luid)) {
    Status = false;
    goto EXIT;
}
priv.PrivilegeCount = 1;
priv.Privileges[0].Luid = luid;
priv.Privileges[0].Attributes = bEnablePrivilege ? SE_PRIVILEGE_ENABLED : SE_PRIVILEGE_REMOVED;
if (!AdjustTokenPrivileges(hToken, false, &priv, 0, 0, 0)) {
    Status = false;
    goto EXIT;
}
std::cout << "priv:" << GetLastError() << std::endl; //gives 0(no error) on first pair of enable/disable, then 0x514, which is ERROR_NOT_ALL_ASSIGNED, on the following loops.
EXIT:
if (hToken)
    CloseHandle(hToken);
return Status;

2 个答案:

答案 0 :(得分:2)

MSDN告诉你原因:

  

<强> SE_PRIVILEGE_REMOVED

     

由于权限已从令牌中删除,因此尝试重新启用权限会导致警告ERROR_NOT_ALL_ASSIGNED,就好像该权限从未存在一样。

将属性设置为0以禁用。 MSDN有一个示例here ...

答案 1 :(得分:0)

感谢Anders,

更改行

priv.Privileges[0].Attributes = bEnablePrivilege ? SE_PRIVILEGE_ENABLED : SE_PRIVILEGE_REMOVED;

priv.Privileges[0].Attributes = bEnablePrivilege ? SE_PRIVILEGE_ENABLED : NULL;

修复了代码。但是代码现在只启用/禁用权限。 正如MSDN所说

  

删除权限是不可逆转的

所以我无法将其删除并重新添加。