Terminaison de programmes
Question : comment faire en sorte d'interdire à un utilisateur non autorisé de tuer un programme C++ builder à partir du gestionnaire de tache?. Je pensais qu'il suffisait dans l'application d'intercepter les messages WM_QUIT ou WM_CLOSE : mais ça n'a pas l'air de marcher. Une idée?. :cry:
Terminaison de programmes
:D Voilà c'est fait. J'ai repris le code delphi pour le passer en C++.
Cela donne les qq lignes ci-après (J'ai testé et ça fonctionne très bien):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
Fichier header
#include <system.hpp>
#include <tlhelp32.h>
DWORD __fastcall GetProcessId(char *nomProgramme);
Fichier cpp
//------------------------------------------------------------
//fonction qui retourne l'id d'un process fourni en paramètre
DWORD __fastcall TSDIAppForm::GetProcessId(char *nomProgramme)
{
HANDLE handle;
DWORD pId;
PROCESSENTRY32 pe;
bool fin;
fin = false;
pId = 0;
pe.dwSize = sizeof(PROCESSENTRY32);
handle = CreateToolhelp32Snapshot(TH32CS_SNAPALL , 0); //recupere un capture de process
if ( Process32First(handle, &pe) == true)// recherche premier process de la liste
{ // on a le premier process de la liste => il faut vérifier si c'est celui-là
if (UpperCase(ExtractFileName(pe.szExeFile)) == UpperCase(nomProgramme))
{ // le process correspond à celui qu'on cherche
pId = pe.th32ProcessID; // recupere l'id du process
}
else
{
while ((Process32Next(handle, &pe) == true) && (fin == false))
{ //dans le cas contraire du test on continue à chercher le process en question
if (UpperCase(ExtractFileName(pe.szExeFile)) == UpperCase(nomProgramme))
{
pId = pe.th32ProcessID;
fin = true; // On a trouvé, on peut arrêter la recherche
}
}
}
}
CloseHandle(handle);
return(pId);
}
//---------------------------------------------------------------------------
void __fastcall TSDIAppForm::TimerGestionnaireDeTacheTimer(TObject *Sender)
{ // L'objectif est de tuer toute instance lancée du gestionanire de tâche
// pour éviter qu'un utilisateur puisse tuer l'application sans avoir
// l'autorisation
HANDLE handle;
DWORD pId;
pId = GetProcessId("taskmgr.exe");
if (pId != 0)
{ // A priori on a trouvé le programme recherché, il faut vérifier si on peut l'atteindre
handle = OpenProcess(PROCESS_ALL_ACCESS ,true,pId); //handle du process
if (handle != NULL)
{ // Ben on l'a trouvé et c'est OK , il n'y plus qu'à le tuer
TerminateProcess(handle,-9);
CloseHandle(handle);
}
}
} |