c ++ - AdjustTokenPrivileges: ERROR\_NOT\_ALL\_ASSIGNED efter succes

Indlæg af Hanne Mølgaard Plasc

Problem



Min kode har en loop, der bruger JustTokenPrivileges til at aktivere SE\_DEBUG\_NAME privilegium og fjerne det.
Hver gang jeg kører det, lykkes det første sæt aktivere/deaktivere, men efter den første sløjfe giver de resterende sæt aktiver/fjerner s ERROR\_NOT\_ALL\_ASSIGNED s for AdjustTokenPrivileges.
Maskinen er Windows 10 pro 64bit. Den udarbejdede exe kører i 'Kør som administrator' -tilstand.
Hjælp venligst.


Følgende kode er i en loop.


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;

Bedste reference


MSDN fortæller dig hvorfor: [4]



   SE\_PRIVILEGE\_REMOVED :

  
  Fordi privilegiet er blevet fjernet fra symbolet, forsøger man at genaktivere privilegieresultatet i advarslen ERROR\_NOT\_ALL\_ASSIGNED som om privilegiet aldrig havde eksisteret.



Indstil attributten til 0 for at deaktivere. MSDN har et eksempel her ... [5]

Andre referencer 1


Tak for Anders,


ændre linjen


priv.Privileges[0].Attributes = bEnablePrivilege ? SE\_PRIVILEGE\_ENABLED : SE\_PRIVILEGE\_REMOVED;


til


priv.Privileges[0].Attributes = bEnablePrivilege ? SE\_PRIVILEGE\_ENABLED : NULL;


fikset koden. Men koden aktiverer/deaktiverer kun privilegiet.
Som MSDN siger



  Fjernelsen af ​​privilegiet er uoprettelig



Så jeg kan ikke fjerne det og tilføje det igen.