调整令牌权限:成功后ERROR_NOT_ALL_ASSIGNED

AdjustTokenPrivileges: ERROR_NOT_ALL_ASSIGNED after success

本文关键字:NOT ALL ASSIGNED ERROR 令牌 权限 成功 调整      更新时间:2023-10-16

我的代码有一个循环,它使用AdjustTokenPrivileges启用SE_DEBUG_NAME权限并将其删除。每次我运行它时,第一组启用/禁用都是成功的,但是在第一个循环之后,其余的启用/删除组都会为 AdjustTokenPrivileges 提供ERROR_NOT_ALL_ASSIGNED。机器是Windows 10专业版64位。编译后的 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;

MSDN 会告诉您原因:

SE_PRIVILEGE_REMOVED

由于该特权

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

将属性设置为 0 以禁用。MSDN 这里有一个例子...

感谢安德斯,

更改行

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

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

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

取消特权是不可逆

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