我的代码有一个循环,该循环使用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有一个示例here ...

关于c++ - AdjustTokenPrivileges:成功后为ERROR_NOT_ALL_ASSIGNED,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49972136/

10-10 07:48