[C++] Prozessprüfung in DLL ohne Admin Rechte

Operator_Jon

Erfahrenes Mitglied
Hi Leute,

ich habe eine Frage bezüglich einer C++ DLL die ich für ein Programm geschrieben habe welches nur C++ DLL's akzeptiert (leider, denn ich bin nicht gut in C++ :) )

Ich habe folgenden Code in einer Function um zu bestimmen ob ein bestimmter Prozess läuft:
C++:
__declspec(dllexport) int _stdcall isRunning(char *vName) {
	string pName = vName;

	unsigned long aProcesses[1024], cbNeeded, cProcesses;
	if(!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
		return -1;

	cProcesses = cbNeeded / sizeof(unsigned long);
	for(unsigned int i = 0; i < cProcesses; i++)
	{
		if(aProcesses[i] == 0)
			continue;

		HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, aProcesses[i]);
		char buffer[50];
		GetModuleBaseName(hProcess, 0, buffer, 50);
		CloseHandle(hProcess);
		if(pName == string(buffer))
			return 1;
	}
	return 0;
}

Das ganze funktioniert auch sehr gut, leider aber nur (Vista/7) wenn man das Programm mit Admin-Rechten startet. Ist es irgendwie Möglich das gleiche zu erreichen ohne den Benutzer zu zwingen das Programm mit Admin Rechten zu starten?

Vielen Dank im Vorraus, ich hoffe ich habe mich verständlich genug ausgedrückt :)

Schönen Gruß,
Jonathan
 
Zuletzt bearbeitet:
Hallo,

ist zwar nicht eine komplette Antwort, aber unter Linux-Systemen kannst nachschauen, ob unter /proc/ ein Ordner mit der PID als Name existiert. In den Ordnern befindet sich auch die Datei "cmdline" mit der du den Namen des aufgerufenen Programms mitsamt Argumenten rausfinden kannst.

Gruß
BK
 
Hm, das Programm ist leider Windows basiert und das konkrete Problem habe ich ab Vista aufwärts!
Gibt es denn so eine Art von /proc/ als Windows Äquivalent?
 
Ich hätte noch den Vorschlag einfach alle Prozesse durchzugehen und zu schauen ob der richtige dabei ist. Dafür brauchst du nur die user32.dll und die tlhelp32.h.

Alles Prozesse auflisten
C++:
typedef std::list<PItem*> PItemList;

PItemList getProcessList()
{
	PItemList ProcessList;
	char buffer[260];
	
	HANDLE hSnapShot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0);
	PROCESSENTRY32* processInfo = new PROCESSENTRY32;
	processInfo->dwSize = sizeof ( PROCESSENTRY32);

	while( Process32Next(hSnapShot,processInfo) != FALSE )
	{
		wcstombs(buffer, processInfo->szExeFile, sizeof(buffer)); 
		ProcessList.push_back (new PItem(buffer, processInfo->th32ProcessID));
	};

	CloseHandle ( hSnapShot);
	delete processInfo;

	return ProcessList;
}

Ist nur als Bsp gedacht hat ich gerade so rumfliegen den Code und nicht wunder wegen PItem

C++:
class PItem
{
private:
	String	ProcessName;
    int		ID;

public:
	PItem();
	PItem(String processname, int id);
	~PItem();

	

	String	getProcessName();
	void	setProcessName(String processname);	

	int		getID();
	void	setID(int id);

};

MFG kb gerade Code zu ändern^^. Den Rest bekommst du ja alleine hin. Das mit dem PItem war nur zur Vervollständigung, das sit ja für dich ncith nötig.

EDIT: oh gerade dein Code angeschaut, du gehst ja auch alles durch XD, nur anders^^ -.-

Ach und falls du einen Prozess mit Fenster übeprüfen wilslt kannst du ja auch noch FindWindow()(http://msdn.microsoft.com/en-us/library/ms633499(VS.85).aspx) probieren.
 
Zuletzt bearbeitet:
Hi 3Cyb3r,

es hat etwas länger gedauert aber ich habe es endlich ausprobieren können!
Dein Code klappt hervorragend,sich musste kaum etwas ändern!

Ich danke dir vielmals :)

Schöne Grüße,
Jonathan
 
Zurück