c ++ - OpenProcessToken mislykkes efter ImpersonateLoggedOnUser

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en tjeneste, der udgiver en bruger. Tjenesten kører som Local System. Brugeren er en lokal administrator og domæneadministrator. Efter efterligning er det nødvendigt for mig at justere procesens token privilegier. Jeg håbede at gøre det ved hjælp af OpenProcessToken og derefter AdjustTokenPrivileges på det returnerede token håndtag.


Efter at have ringet til LogonUser og ImpersonateLoggedOnUser fejler det følgende opkald med adgang nægtet.


HANDLE hToken;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN\_ADJUST\_PRIVILEGES, &hToken))
{
      Log("Error=\%d", GetLastError());
}


Jeg logger på brugeren ved hjælp af LOGON32\_LOGON\_INTERACTIVE og LOGON32\_PROVIDER\_DEFAULT.


Justering af det samme privilegium på brugertoken lykkes.

Bedste reference


Dette er et todelt svar, afhængigt af hvad du forsøger at gøre:


1) Hvis du vil justere privilegierne for efterligningstokenet, skal du bruge funktionen OpenThreadToken, ikke OpenProcessToken. Impersonation påvirker tråden, ikke processen som helhed. Prøv dette:


OpenThreadToken(GetCurrentThread(), TOKEN\_READ | TOKEN\_ADJUST\_PRIVILEGES, TRUE, &hToken)


2) Hvis du virkelig ønskede at justere privilegierne til procestoken, skal du nok gøre det på et tidspunkt, hvor du ikke udgiver klienten. Du kan tænde og slukke forpersonlig til og fra efter behov.