SetSecurityInfo échoue pour PROCESS_TERMINATE

J’essaie de définir la sécurité de PROCESS_TERMINATE. Ceci est le code:

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); 

Ici, SetSecurityInfo pour PROCESS_TERMINATE échoue et j’obtiens une Unhandled Exception..(KERNEL32.dll):Access Violation pour

 GetExitCodeProcess(pi.hProcess, lpExitCode); 

Pourquoi cela arrive-t-il? Je vous remercie

La violation d’access est due à ce code:

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

Ici, vous déclarez que lpExitCode est un pointeur, mais vous ne le pointez sur rien. Lorsque GetExitCodeProcess tente d’écrire dans *lpExitCode il en résulte une violation d’access.

La bonne approche est la suivante:

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

Je ne crois pas non plus que vous ayez besoin d’appeler SetSecurityInfo . Le processus gère que retourne CreateProcess doit avoir des droits suffisants.

Vous devrez attendre que le processus généré se termine avant de pouvoir obtenir un code de sortie. Cela est dû au fait que GetExitCodeProcess est asynchrone. Vous pouvez attendre comme ceci:

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

Et n’oubliez pas de vérifier tous vos appels API pour les erreurs.

Outre l’appel incorrects à GetExitCodeProcess , votre appel à SetSecurityInfo est également incorrect. PROCESS_TERMINATE n’est pas une valeur valide pour le troisième paramètre. Selon la documentation , les valeurs valides pour le troisième paramètre sont

OWNER_SECURITY_INFORMATION: Inclure le propriétaire.

GROUP_SECURITY_INFORMATION: Inclure le groupe primaire.

DACL_SECURITY_INFORMATION: Inclut la liste de contrôle d’access discrétionnaire (DACL).

SACL_SECURITY_INFORMATION: inclut la liste de contrôle d’access système (SACL).

LABEL_SECURITY_INFORMATION: Inclut l’entrée de contrôle d’access à l’étiquette d’intégrité obligatoire (ACE).

ATTRIBUTE_SECURITY_INFORMATION: Incluez les informations d’atsortingbut de la SACL.

SCOPE_SECURITY_INFORMATION: Inclut l’identifiant de la politique d’access central (CAP) de la SACL.

Votre valeur de PROCESS_TERMINATE se trouve être numériquement égale à OWNER_SECURITY_INFORMATION donc votre appel tente réellement de changer le propriétaire du processus (mais le fait incorrectement, ce qui explique pourquoi l’appel échoue).