[C++] Alle aktiven Prozesse mit PID auflisten



  • Hi Leute,

    ich würde gerne ein Programm schreiben, welches ein Programm öffnet, wenn es geschlossen ist, und es schließt, wenn es geöffnet ist.

    Daher wollte ich erstmal damit anfangen alle Prozesse auszulesen und auflisten zu können.
    Deshalb hab ich was recherchiert und bin auf den Code gestoßen:

    #include "stdafx.h"
    #include <iostream>
    #include <conio.h>
    #include <clocale>
    #include <Windows.h>
    #include <Psapi.h>
    
    using namespace std;
    
    void PrintProcessNameAndID(DWORD processID) {
    	HMODULE hMod;
    	DWORD cbNeeded;
    	TCHAR szProcessName[MAX_PATH] = TEXT("<unbekannt>");
    	HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
    	if (hProcess != NULL) {
    		if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) {
    			GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR));
    		}
    	}
    	_tprintf(TEXT("%s  (PID: %u)\n"), szProcessName, processID);
    	CloseHandle(hProcess);
    }
    
    int _tmain(int argc, _TCHAR* argv[]) {
    	DWORD aProcesses[1024], cbNeeded, cProcesses;
    	unsigned int i;
    	setlocale(LC_ALL, "German");
    	EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded);
    	cProcesses = cbNeeded / sizeof(DWORD);
    	for (i = 0; i <= cProcesses; i++) {
    		if (aProcesses[i] != 0) {
    			PrintProcessNameAndID(aProcesses[i]);
    		}
    	}
    	_getch();
    	return 0;
    }
    

    Ich kompiliere in Visual C++ 2013. Wenn ich jedoch das Programm jetzt laufen lasse, dann zeigt es mir nur 32-bit Prozesse an. Wenn ich das Programm als 64-bit laufen lasse, dann zeigt es 32-bit & 64-bit Prozesse an, jedoch werden dennoch nicht alle angezeigt. Als Administrator ausführen hab ich auch schon versucht.

    Nun meine Frage: Wie kann ich es schaffen, dass das Programm alle Prozesse auflistet?
    Hab da auch schon ein bischen gegoogelt, auf eine Lösung bin ich aber nicht gestoßen.

    Würde mich freuen, wenn mir da jemand helfen kann.

    LG

    jkhsjdhjs



  • Bei mir gehts... (Mal davon abgesehen dass der Code leicht fehlerhaft ist)
    Welche Prozesse fehlen denn ?



  • DarkShadow44 schrieb:

    Bei mir gehts...

    Hast du ein 32bit System?

    DarkShadow44 schrieb:

    (Mal davon abgesehen dass der Code leicht fehlerhaft ist)

    An welcher Stelle ist der Code denn fehlerhaft?

    DarkShadow44 schrieb:

    Welche Prozesse fehlen denn ?

    Also, bei der 32bit Exe werden angezeigt:
    NvBackend.exe
    DTLite.exe
    AnyDVDtray.exe
    Dropbox.exe
    jusched.exe
    HD-Agent.exe
    iTunesHelper.exe
    PTBSync.exe
    firefox.exe
    Programm.exe (das Programm selbst)

    Also fehlen:
    ADVDDiscHlp64.exe (wird bei der 64bit-Version angezeigt)
    AppleMobileDeviceService.exe
    ApplicationWebServer.exe
    armsvc.exe
    conhost.exe (6x) (wird bei der 64bit-Version 2x angezeigt)
    csrss.exe (2x)
    dasHost.exe
    DeskDrive.exe (wird bei der 64bit-Version angezeigt)
    dllhost.exe (wird bei der 64bit-Version angezeigt)
    dpupdchk.exe (wird bei der 64bit-Version angezeigt)
    dwm.exe
    explorer.exe (wird bei der 64bit-Version angezeigt)
    GoogleUpdate.exe
    HD-BlockDevice.exe
    HD-LogRotatorService.exe
    HD-Network.exe
    HD-Service.exe
    HD-ShaderFolder.exe
    iPodService.exe
    ipoint.exe (wird bei der 64bit-Version angezeigt)
    livecomm.exe
    lkads.exe
    lkcitdl.exe
    lktsrv.exe
    lsass.exe
    mDNSResponder.exe
    MsMpEng.exe
    nidmsrv.exe
    nidmsrvResponder.exe
    NisSrv.exe
    NvNetworkService.exe
    nvSCPAPISvr.exe
    nvstreamsvc.exe (2x)
    nvtray.exe (wird bei der 64bit-Version angezeigt)
    nvvsvc.exe (2x)
    nvxdsymc.exe
    PnkBstrA.exe
    PsiService.exe
    PTBSync.exe (steht schon oben, ist aber 2x vorhanden)
    RAVCpl64.exe (wird bei der 64bit-Version angezeigt)
    RuntimeBroker.exe
    SbieSvc.exe
    SearchIndexer.exe
    services.exe
    SettingSyncHost.exe (wird bei der 64bit-Version angezeigt)
    SkyDrive.exe (wird bei der 64bit-Version angezeigt)
    smss.exe
    spoolsv.exe
    sqlservr.exe
    sqlwriter.exe
    Start8_64.exe
    Start8Srv.exe
    svchost.exe (12x)
    SystemWebServer.exe
    taskeng.exe
    taskhostex.exe (wird bei der 64bit-Version angezeigt)
    TeamViewer_Service.exe
    wininit.exe
    winlogon.exe
    WmiPrvSE.exe
    wmpnetwk.exe
    WUDFHost.exe (2x)

    Also werden bei der 32bit Version ausschließlich 32bit Programme angezeigt.
    Verschiedene 64bit Prozesse werden bei der 64bit Version angezeigt, aber dennoch nicht alle.

    EDIT: Habe die Programme beide Male als Administrator ausgeführt.



  • for (i = 0; i <= cProcesses; i++)
    

    muss

    for (i = 0; i < cProcesses; i++)
    

    sein.
    Und ohne Änderungen kompiliert der Code bei mir nicht, aber das kann auch an mir liegen... 😃

    Ich hab ein Win7 x64, und bei mir werden sowohl als 32 als auch bei 64 Bit Programm alle Prozesse aufgelistet.
    Habs grad auch nochmal inner VM ausgetestet (auch 64Bit), selbes Ergebnis.



  • DarkShadow44 schrieb:

    for (i = 0; i <= cProcesses; i++)
    

    muss

    for (i = 0; i < cProcesses; i++)
    

    sein.
    Und ohne Änderungen kompiliert der Code bei mir nicht, aber das kann auch an mir liegen... 😃

    Ok, Danke. Werde das ändern.
    Dass er das bei dir ohne die Änderung nicht kompiliert, liegt warscheinlich am Compiler. ^^
    Ich nutze ja Visual Studio, da akzeptiert er das so.

    DarkShadow44 schrieb:

    Ich hab ein Win7 x64, und bei mir werden sowohl als 32 als auch bei 64 Bit Programm alle Prozesse aufgelistet.
    Habs grad auch nochmal inner VM ausgetestet (auch 64Bit), selbes Ergebnis.

    Ich hab Win8.1 x64. Liegt dann warscheinlich daran. Oder könntest du mir mal deine kompilierte Version, also die exe, schicken damit ich die mal bei mir ausprobieren kann?



  • Ich verwende auf VS. Ich denke an der Exe wird nicht viel anders sein, denke das liegt an irgendwelchen Rechteeinstellungen.
    Schonmal mit "CreateToolhelp32Snapshot" probiert ?



  • DarkShadow44 schrieb:

    Ich verwende auf VS. Ich denke an der Exe wird nicht viel anders sein, denke das liegt an irgendwelchen Rechteeinstellungen.
    Schonmal mit "CreateToolhelp32Snapshot" probiert ?

    Nope, kannte die Funktion nicht. Werd mir sie mal anschaun. Danke 😃





  • Hi schrieb:

    http://stackoverflow.com/a/6877424/1884226

    Ja, das hab ich auch schon vorher gehört. Deshalb hab ich es ja auch als 64bit Anwendung kompiliert. Leider hat es dann immer noch nicht funktioniert. Dann probier ich das jetzt mit CreateToolhelp32Snapshot!



  • So, habs jetzt mit CreateToolhelp32Snapshot!
    Funktioniert 1A! 😃

    Danke für die ganze Hilfe!

    #include "stdafx.h"
    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    #include <tlhelp32.h>
    
    using namespace std;
    
    void ListRunningProcesses() {
    	int i = 0;
    	HANDLE hProcessSnapshot;
    	PROCESSENTRY32 pe32;
    	hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    	pe32.dwSize = sizeof(PROCESSENTRY32);
    	if (!Process32First(hProcessSnapshot, &pe32)) {
    		CloseHandle(hProcessSnapshot);
    	}
    	do {
    		wcout << "Prozess: " << pe32.szExeFile << endl;
    		i++;
    	} while (Process32Next(hProcessSnapshot, &pe32));
    	CloseHandle(hProcessSnapshot);
    	cout << endl << i << " Prozesse laufen." << endl;
    }
    
    int _tmain(int argc, _TCHAR* argv[]) {
    	cout << "Liste aller laufenden Prozesse:" << endl;
    	ListRunningProcesses();
    	_getch();
    	return 0;
    }
    

    EDIT: So, hier mal mein aktueller Code. Habe da aber noch ne Frage:

    // Hamachi Launcher.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    #include <tlhelp32.h>
    #include <clocale>
    #include <comdef.h>
    #include <string>
    
    using namespace std;
    
    bool CheckForProcessRunning(string process) {
    	string ExeFile;
    	HANDLE hProcessSnapshot;
    	PROCESSENTRY32 pe32;
    	hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    	pe32.dwSize = sizeof(PROCESSENTRY32);
    	if (!Process32First(hProcessSnapshot, &pe32)) {
    		CloseHandle(hProcessSnapshot);
    	}
    	do {
    		_bstr_t ExeFileSTR(pe32.szExeFile);
    		ExeFile = ExeFileSTR;
    		if (ExeFile == process) {
    			CloseHandle(hProcessSnapshot);
    			return true;
    		}
    	} while (Process32Next(hProcessSnapshot, &pe32));
    	CloseHandle(hProcessSnapshot);
    	return false;
    }
    
    int _tmain(int argc, _TCHAR* argv[]) {
    	setlocale(LC_ALL, "German");
    	string UI = "hamachi-2-ui.exe", Service = "hamachi-2.exe";
    	LPCTSTR lpServiceName = L"Hamachi2Svc";
    	SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    	if (hSCManager == 0) {
    		cout << "Es sind Fehler aufgetreten!" << endl;
    		cout << GetLastError() << endl;
    	}
    	SC_HANDLE hService = OpenService(hSCManager, lpServiceName, SC_MANAGER_ALL_ACCESS);
    	if (hService == 0) {
    		cout << "Es sind Fehler aufgetreten!" << endl;
    		cout << GetLastError() << endl;
    	}
    	if (CheckForProcessRunning(Service) == false) {
    		if (StartService(hService, NULL, NULL) == TRUE) {
    			cout << "Der Dienst \"LogMeIn Hamachi Tunneling Engine\" wurde erfolgreich gestartet!";
    		}
    		else {
    			cout << "Der Dienst \"LogMeIn Hamachi Tunneling Engine\" konnte nicht gestartet werden!" << endl;
    			cout << GetLastError() << endl;
    		}
    		Sleep(2000);
    		if (CheckForProcessRunning(UI) == false) {
    			ShellExecute(NULL, NULL, L"C:\\Program Files (x86)\\LogMeIn Hamachi\\hamachi-2-ui.exe", NULL, NULL, SW_SHOW);
    		}
    	}
    	else {
    		ControlService(hService, SERVICE_CONTROL_STOP, NULL);
    		cout << GetLastError();
    		cout << "Der Dienst wurde gestoppt!";
    	}
    	_getch();
    	return 0;
    }
    

    Und zwar soll das Programm den Hamachi Dienst starten, wenn er nicht schon gestartet ist. Sollte er schon gestartet sein, soll es ihn beenden.
    Nur aus irgendeinem Grund erhalte ich immer bei

    ControlService(hService, SERVICE_CONTROL_STOP, NULL);
    		cout << GetLastError();
    

    Error 487. Habe schon gegoogelt, das heißt wohl Attempt to access invalid address. Nur warum? StartService funktioniert schließlich einwandfrei.

    Hat da jemand von euch einen Rat oder nen Fehler gefunden?



  • Also so ein bisschen komisch ist das schon, bei mir nutzen jedenfalls beide Funktionen intern die selbe API... 😕

    Zu deinem Problem:

    SERVICE_STATUS out;
    ControlService(hService, SERVICE_CONTROL_STOP, &out);
    

    Der dritte Paramter ist nicht optional 😉



  • DarkShadow44 schrieb:

    Also so ein bisschen komisch ist das schon, bei mir nutzen jedenfalls beide Funktionen intern die selbe API... 😕

    Zu deinem Problem:

    SERVICE_STATUS out;
    ControlService(hService, SERVICE_CONTROL_STOP, &out);
    

    Der dritte Paramter ist nicht optional 😉

    Achso, da hab ich gestern in der msdn opt wohl mit out verwechselt ^^

    Danke 🙂

    Funktioniert jetzt alles einwandfrei!


Log in to reply