J'essaye d'obtenir le traitement de, disons example.exe, donc je peux appeler TerminateProcess
dessus. Comment puis-je faire ceci? Notez, il n'a pas de fenêtre, donc FindWindow
ne fonctionnera pas.Comment puis-je obtenir un handle de processus par son nom en C++?
Répondre
#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>
int main(int, char *[])
{
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry) == TRUE)
{
while (Process32Next(snapshot, &entry) == TRUE)
{
if (stricmp(entry.szExeFile, "target.exe") == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
// Do stuff..
CloseHandle(hProcess);
}
}
}
CloseHandle(snapshot);
return 0;
}
Aussi, si vous souhaitez utiliser PROCESS_ALL_ACCESS dans OpenProcess, vous pouvez essayer ceci:
#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>
void EnableDebugPriv()
{
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = luid;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL);
CloseHandle(hToken);
}
int main(int, char *[])
{
EnableDebugPriv();
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry) == TRUE)
{
while (Process32Next(snapshot, &entry) == TRUE)
{
if (stricmp(entry.szExeFile, "target.exe") == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
// Do stuff..
CloseHandle(hProcess);
}
}
}
CloseHandle(snapshot);
return 0;
}
Départ: MSDN Article
Vous pouvez utiliser GetModuleName
(je pense?) Pour obtenir le nom et vérifier contre cela.
La plupart des noms GetModuleName, QueryFullProcessImage, etc., requièrent un handle et ne seront donc pas très utiles. Toolhelp renvoie le nom du processus. – Michael
OpenProcess Fonction
De MSDN:
Pour ouvrir une poignée à un autre processus local et d'obtenir les droits d'accès, vous devez activer le privilège SeDebugPrivilege.
Je n'ai pas le pID, seul le nom. – Malfist
SeDebugPrivilege n'est absolument pas nécessaire pour les processus qui s'exécutent comme vous. Si vous avez accès au processus via sa liste de contrôle d'accès (ce que vous faites généralement pour les processus que vous créez au même niveau d'intégrité que votre code), vous n'avez pas besoin de SeDebugPrivilege. À partir de la même page MSDN: Si l'appelant a activé le privilège SeDebugPrivilege, l'accès demandé est accordé quel que soit le contenu du descripteur de sécurité. – Michael
Oui, vous devez d'abord obtenir l'ID de processus en répétant les processus. –
Il existe deux techniques de base. Le premier utilise PSAPI; MSDN a an example qui utilise EnumProcesses
, OpenProcess
, EnumProcessModules
et GetModuleBaseName
.
L'autre utilise Toolhelp, que je préfère. Utilisez CreateToolhelp32Snapshot
pour obtenir un instantané de la liste de processus, passez dessus avec Process32First
et Process32Next
, qui fournit le nom du module et l'ID du processus, jusqu'à ce que vous trouviez celui que vous voulez, puis appelez OpenProcess
pour obtenir un handle.
Le code suivant montre comment vous pouvez utiliser TOOLHELP et OpenProcess pour obtenir une poignée au processus . La gestion des erreurs a été supprimée par souci de concision.
HANDLE GetProcessByName(PCSTR name)
{
DWORD pid = 0;
// Create toolhelp snapshot.
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
// Walkthrough all processes.
if (Process32First(snapshot, &process))
{
do
{
// Compare process.szExeFile based on format of name, i.e., trim file path
// trim .exe if necessary, etc.
if (string(process.szExeFile) == string(name))
{
pid = process.th32ProcessID;
break;
}
} while (Process32Next(snapshot, &process));
}
CloseHandle(snapshot);
if (pid != 0)
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
}
// Not found
return NULL;
}
Vous avez oublié une parenthèse dans la condition "if (MatchProcessName (process.szExeFile, name)" –
Comme la réponse de xian, il s'agit d'une condition de concurrence et elle est intrinsèquement dangereuse – benrg
@Occulta 'if (string (process.szExeFile) == string (name)) 'peut être utilisé à la place de cette fonction, j'ai édité la réponse de Michael. – bytecode77
- 1. Obtenir le processus en cours donné handle de processus
- 2. Win32API - Comment obtenir le nom de fichier du processus à partir du handle de processus?
- 3. Comment sélectionner un TreeNode par son nom?
- 4. Comment obtenir une connexion ODBC par son nom?
- 5. Comment obtenir une référence à un contrôle à partir de son nom de chaîne en C#
- 6. Comment obtenir le nom associé à ouvrir HANDLE
- 7. Comment puis-je trouver l'ID de processus à partir du nom de service/handle dans Delphi?
- 8. Créer une instance de classe objective-c par son nom?
- 9. Obtenir le handle de la fenêtre en C#
- 10. Comment faire pour modifier un propriétaire de fenêtre en utilisant son handle
- 11. C++: Obtenir le nom du processus exécutant mon application
- 12. Modifier le nom du processus en C#?
- 13. Comment créer un handle global en C++ - CLI
- 14. Obtenir un contrôle Windows Forms par nom dans C#
- 15. Comment puis-je obtenir une liste de processus enfants pour un service donné en C#?
- 16. Comment obtenir une image avec son nom et une extension?
- 17. Récupère l'instance de l'application Excel avec C# par Handle
- 18. Quand est-ce que windows signale un handle de processus?
- 19. ne puis-je pas définir la transparence d'une fenêtre par son handle dans C#?
- 20. Comment obtenir le handle de module de mon propre code?
- 21. Comment obtenir un nom de script dans un fichier de comptabilité de processus BSD?
- 22. ActionScript - comment traiter une instance par son nom?
- 23. Comment obtenir le nom de l'appareil en C#?
- 24. Comment définir le champ du modèle django par son nom?
- 25. Comment puis-je obtenir l'icône du fichier exécutable ayant seulement une instance de son Processus en C#
- 26. Vérifiez si le handle appartient au processus en cours?
- 27. Comment créer un objet enum à partir de son type et de son nom?
- 28. Comment sélectionner un nœud XML en fonction de son contenu?
- 29. Obtenir une définition de la colonne par son nom dans WPF
- 30. Comment créer un processus qui survivrait son parent
Votre code ignorera le premier processus dans le système (cependant, le premier processus est probablement "SYSTEM" donc pas de bogue visible par l'utilisateur.) – Michael
Le premier processus est SYSTEM, donc c'est bien (j'ai littéralement pris ce code directement mes projets);) – xian
Quand j'essaye d'agir sur le hProcess j'obtiens le code d'erreur 6 qui est ERROR_INVALID_HANDLE – Malfist