windows - SetSecurityInfo mislykkes for PROCESS\_TERMINATE

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at indstille sikkerhed for PROCESS\_TERMINATE. Dette er koden:


   CreateProcess("C:\ADP\SQLBase\dbntsrv.exe", NULL, NULL, NULL, FALSE, CREATE\_NO\_WINDOW, NULL, "C:\ADP\SQLBase", &si, &pi);       

if(SetSecurityInfo(pi.hProcess, SE\_KERNEL\_OBJECT, PROCESS\_TERMINATE, NULL, NULL, NULL, NULL) == ERROR\_SUCCESS)
{
    MessageBox(NULL, "process\_terminate granted", NULL, MB\_OK);
}
else
{
    MessageBox(NULL, "process\_terminate not granted", NULL, MB\_OK);
}



                    //--------------------- Permission to query for info to use GetExitCode -------------------------
if(SetSecurityInfo(pi.hProcess, SE\_KERNEL\_OBJECT, PROCESS\_QUERY\_INFORMATION, NULL, NULL, NULL, NULL) == ERROR\_SUCCESS)
{
    MessageBox(NULL, "process\_query\_information granted", NULL, MB\_OK);
}
else
{
    MessageBox(NULL, "process\_query\_information not granted", NULL, MB\_OK);
}


LPDWORD lpExitCode;
GetExitCodeProcess(pi.hProcess, lpExitCode);


Her SetSecurityInfo til PROCESS\_TERMINATE fejler, og jeg får en Unhandled Exception..(KERNEL32.dll):Access Violation til


GetExitCodeProcess(pi.hProcess, lpExitCode);


Hvorfor sker dette? Tak skal du have

Bedste reference


Adgangskrænkelsen er på grund af denne kode:


LPDWORD lpExitCode;
GetExitCodeProcess(pi.hProcess, lpExitCode);


Her erklærer du, at lpExitCode er en pointer, men det gør du ikke opmærksom på noget. Når GetExitCodeProcess forsøger at skrive til *lpExitCode, resulterer det i en adgangsfejl.


Den korrekte tilgang er som sådan:


DWORD ExitCode;
GetExitCodeProcess(pi.hProcess, &ExitCode);


Jeg tror heller ikke på, at du skal ringe SetSecurityInfo. Processen håndterer, at CreateProcess afkastet skal have tilstrækkelige rettigheder.


Du bliver nødt til at vente på, at den frembragte proces ophører, før du kan forvente at få en exitkode. Dette skyldes, at GetExitCodeProcess er asynkron. Du kan vente på følgende måde:


WaitForSingleObject(pi.hProcess);
//now you can call GetExitCodeProcess and expect an answer.


Og husk at tjekke alle dine API-opkald til fejl.

Andre referencer 1


Ud over incorect-opkaldet til GetExitCodeProcess er dit opkald til SetSecurityInfo også forkert. PROCESS\_TERMINATE er ikke en gyldig værdi for den tredje parameter. Ifølge dokumentationen er gyldige værdier for den tredje parameter [18]



  OWNER\_SECURITY\_INFORMATION: Inkluder ejeren.

  
  GROUP\_SECURITY\_INFORMATION: Inkluder den primære gruppe.

  
  DACL\_SECURITY\_INFORMATION: Inkluder den diskretionære adgangskontrol liste (DACL).

  
  SACL\_SECURITY\_INFORMATION: Inkluder systemadgangskontrollisten (SACL).

  
  LABEL\_SECURITY\_INFORMATION: Medtag adgangskoden for obligatorisk integritetsmærkeadgangskontrol (ACE).

  
  ATTRIBUTE\_SECURITY\_INFORMATION: Inkluder attributinformationen for SACL.

  
  SCOPE\_SECURITY\_INFORMATION: Inkluder den centrale adgangs politik (CAP) -identifikator for SACL.



Din værdi på PROCESS\_TERMINATE er numerisk lig med OWNER\_SECURITY\_INFORMATION, så dit opkald forsøger faktisk at ændre procesejeren (men gør det forkert, hvorfor samtalen mislykkes).