Ich versuche, das Prozess-Handle von, sagen wir Beispiel.exe, so dass ich TerminateProcess
darauf aufrufen kann. Wie kann ich das machen? Beachten Sie, dass es kein Fenster hat, so dass FindWindow
nicht funktioniert.Wie kann ich ein Prozess-Handle nach seinem Namen in C++ erhalten?
Antwort
#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;
}
Auch wenn Sie PROCESS_ALL_ACCESS in Open verwenden möchten, können Sie dies versuchen:
#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;
}
Check out: MSDN Article
Sie können GetModuleName
verwenden (ich glaube?), Um den Namen zu erhalten und prüfen Sie dagegen.
Die meisten GetModuleName, QueryFullProcessImage Name, etc., erfordern ein Handle und wird daher nicht viel nutzen. Toolhelp gibt den Prozessnamen zurück. – Michael
OpenProcess Funktion
Von MSDN:
Um ein Handle zu einem anderen lokalen Prozess zu öffnen und volle Zugriffsrechte zu erhalten, müssen Sie das SeDebugPrivilege Privileg aktivieren.
Ich habe nicht die pID, nur der Name. – Malfist
SeDebugPrivilege wird definitiv nicht für Prozesse benötigt, die wie Sie laufen. Wenn Sie über die ACL Zugriff auf den Prozess haben (was Sie normalerweise für Prozesse tun, die Sie auf derselben Integritätsstufe wie Ihr Code erstellen), benötigen Sie SeDebugPrivilege nicht. Aus derselben MSDN-Seite: Wenn der Anrufer die SeDebugPrivilege Berechtigung aktiviert ist, wird der angeforderte Zugriff unabhängig vom Inhalt der Sicherheitsbeschreibung gewährt. – Michael
Ja, Sie müssen die Prozess-ID zuerst durch Iteration Prozesse erhalten. –
Es gibt zwei grundlegende Techniken. Der erste verwendet PSAPI; MSDN hat an example die EnumProcesses
, OpenProcess
, EnumProcessModules
und GetModuleBaseName
verwendet.
Die andere Verwendung Toolhelp, die ich bevorzuge. Verwenden Sie CreateToolhelp32Snapshot
einen Snapshot der Prozessliste zu bekommen, gehen über sie mit Process32First
und Process32Next
, die Modulnamen und Prozess-ID liefert, bis Sie das Sie finden möchten, und dann OpenProcess
rufen einen Griff zu bekommen.
Der folgende Code zeigt, wie Sie TOOLHELP und Open zu bekommen einen Handle für den Prozess verwenden können, . Die Fehlerbehandlung wurde der Kürze halber entfernt.
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;
}
Sie haben eine Klammer in der Bedingung "if (MatchProcessName (process.szExeFile, name)" vergessen. –
Wie xian's Antwort hat dies eine Racebedingung und ist von Natur aus unsicher. – benrg
@Occulta 'if (string (process.szExeFile) == string (name)) 'kann anstelle dieser Funktion verwendet werden. Ich habe Michaels Antwort bearbeitet. – bytecode77
- 1. Mootools - wie Wert des ausgewählten Radioeingabetypen erhalten, aus seinem Namen
- 2. Wie kann ich mit querySelector ein Eingabeelement nach Namen auswählen?
- 3. Javascript kann ich Klasse von seinem Namen bekommen?
- 4. Erhalten Sie den Wert einer Instanzvariable mit seinem Namen
- 5. Wie bekomme ich einen Selektor von seinem Namen?
- 6. In XS, wie bekomme ich eine Variablenadresse von seinem Namen?
- 7. Wie lösche ich ein Verzeichnis aus dem Hadoop-Cluster, das ein Komma (,) in seinem Namen hat?
- 8. Java: Erhalte Dateierweiterung mit "." in seinem Namen
- 9. Wie kann ich ein OAuth 2.0-Authentifizierungstoken in C# erhalten
- 10. Wie kann ich ein absolutes Element erhalten, das direkt in seinem Elternteil schwebt?
- 11. Erhalten JavaScript-Funktion-Objekt von seinem Namen als Zeichenfolge?
- 12. Kann ich Text nach seinem numerischen Wert in Python sortieren?
- 13. Kann ich die Namen aller Domänen erhalten, mit denen ein Linux-Computer in C++ verbunden ist?
- 14. wie kann ich Vormonats Namen erhalten in php
- 15. Wie kann ich den Netzwerk-Login-Namen des Benutzers erhalten?
- 16. Machen Sie Objekt mit seinem Namen
- 17. Wie kann ich ein HorizontalScrollView erhalten, um nach dem Hinzufügen von Padding zu seinem Kind zur richtigen Position zu scrollen?
- 18. Wie filtere ich ein Array nach Namen in AngularJS
- 19. erhalten Namen und Werte eines Formulars nach
- 20. Zugang Eigenschaft mit seinem Namen in vb.net
- 21. Wie bekomme ich mercurial einen bestimmten Ordner zu ignorieren, der ein Leerzeichen in seinem Namen hat
- 22. Crop ein Bild von seinem Zentrum in C#
- 23. Wie kann ich den Namen des Mobilfunkanbieters (UWP) erhalten?
- 24. Wie überprüft man, ob ein Programm mit seinem Namen mit Qt (C++) läuft
- 25. Wie kann ich QListWidget-Element nach Name erhalten?
- 26. Win32API - Wie wird der Dateiname des Prozesses vom Prozesshandle abgerufen?
- 27. Wie kann ich Panel-Namen per Javascript erhalten?
- 28. Wie kann ich den Namen der laufenden Java VM erhalten?
- 29. Wie kann ich den Namen der ausführenden .exe erhalten?
- 30. Reagieren Render-Komponente mit seinem Namen
Ihr Code wird den ersten Prozess im System überspringen (erster Prozess ist jedoch höchstwahrscheinlich "SYSTEM", also kein vom Benutzer sichtbarer Fehler.) – Michael
Der erste Prozess ist SYSTEM, also ist es in Ordnung (ich habe diesen Code direkt aus einem von Meine Projekte);) – xian
Wenn ich versuche, auf dem hProcess zu handeln, erhalte ich Fehlercode 6, der ERROR_INVALID_HANDLE ist – Malfist