我的代码有一个循环,它使用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;
答案 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所说
删除权限是不可逆转的
所以我无法将其删除并重新添加。