Prozesse auslesen

VIelen lieben Dank schon mal für deine tolle Hilfe. Bei der Toolhelp-Variante entstehen jetzt keine Fehler mehr, wenn ich den Code von der msdn-Seite kopiere, allerdings verstehe ich es noch nicht so ganz. Ich möchte den Prozess Apache.exe suchen und diesen dann herunterfahren. Ich würde in diesen Zweig kommen, da ich ja kein NT als Betriebssystem einsetze
Doch, du setzt ein NT Betriebssystem ein. Wo hast du denn diesen Code gefunden? Du kannst doch die Funktionen einfach implizit linken lassen und mußt nicht LoadLibrary etc. verwenden...
ich verstehe allerdings nicht, wie ich an den Prozess herankomme.
Was meinst du denn mit "herankommen". Was genau willst du denn mit dem Prozess machen?

Gruß
 
Also eigentlich habe ich XP installiert. das ist doch kein NT Betriebssystem oder? Hier habe ich den Code her: http://support.microsoft.com/kb/175030/de, zumindest geht er in den Zweig "// If any OS other than Windows NT 4.0"

Also ich möchte gerne den Prozess Apache.exe finden und dann den Apache herunterfahren und somit den Prozess beenden. Den Apache würde ich mit "Verzeichnis der Apache.exe/Apache.exe" -f "Verzeichnis der httpd.conf/httpd.conf" -k shutdown herunterfahren, brauche aber dazu den wirklich laufenden Prozess, weil er sonst leider nicht wartet, bis er wirklich heruntergefahren ist. Ich hoffe, du versteht wie ich das meine :)

LG
 
Ich habe jetzt mal probiert, die exe auf unserem Vista-Rechner laufen zu lassen. Leider kam da die Fehlermeldung "Die Anwendung konnte nicht gestartet werden, weil MFC42D.DLL nicht gefunden wurde. Neuinstallation der Anwendunge könnte das Problem beheben". Hast du ne Idee woran das liegen könnte? Muss ich die DLL wirklich neu installieren oder läuft der Code einfach nicht unter Vista :(

LG
 
Also eigentlich habe ich XP installiert. das ist doch kein NT Betriebssystem oder?
Doch Windows 2000, XP, Vista usw. sind alles NT Betriebssysteme. Siehe z.B. http://de.wikipedia.org/wiki/Windows_NT
Hier habe ich den Code her: http://support.microsoft.com/kb/175030/de, zumindest geht er in den Zweig "// If any OS other than Windows NT 4.0"
Wenn dein Code nicht auf älteren Betriebssystemen als Windows 2000 laufen soll, schau mal hier: http://msdn.microsoft.com/en-us/library/ms686701(v=vs.85).aspx

Der Code ist doch viel einfacher.
Also ich möchte gerne den Prozess Apache.exe finden und dann den Apache herunterfahren und somit den Prozess beenden. Den Apache würde ich mit "Verzeichnis der Apache.exe/Apache.exe" -f "Verzeichnis der httpd.conf/httpd.conf" -k shutdown herunterfahren, brauche aber dazu den wirklich laufenden Prozess, weil er sonst leider nicht wartet, bis er wirklich heruntergefahren ist. Ich hoffe, du versteht wie ich das meine :)
Dann mußt du doch nur das szExeFile Element der PROCESSENTRY32 Struktur untersuchen. Siehe http://msdn.microsoft.com/en-us/library/ms684839(v=vs.85).aspx
szExeFile
The name of the executable file for the process. To retrieve the full path to the executable file, call the Module32First function and check the szExePath member of the MODULEENTRY32 structure that is returned. However, if the calling process is a 32-bit process, you must call the QueryFullProcessImageName function to retrieve the full path of the executable file for a 64-bit process.
Gruß
 
Zuletzt bearbeitet:
Jetzt bräuchte idh doch nochmal deinen Rat. Ich habe den Code verwendet, den du mir empfohlen hast. stimmt der ist viel einfacher :)

Ich dachte, so könnte ich den Prozess dann suchen und beenden. Er findet zwar den Prozess, OpenProcess funktioniert auch, zumindest kommt er nicht in den if-Zweig. Er geht in den else-Zweig, läuft da schön durch, aber er beendet den Prozess nicht. Was mache ich falsch? :(

Code:
if(strcmp(pe32.szExeFile, "Apache.exe")==0){
		MessageBox(NULL, pe32.szExeFile, "", MB_OKCANCEL);
		hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
		if( hProcess == NULL ){
			printError( TEXT("OpenProcess") );
		}else
		{
			MessageBox(NULL, "ungelcih null", "", MB_OKCANCEL);
			dwPriorityClass = GetPriorityClass( hProcess );
			if( !dwPriorityClass )
			printError( TEXT("GetPriorityClass") );
			CloseHandle( hProcess );
		    WaitForInputIdle(hProcess, INFINITE);
		    while(WaitForSingleObject(hProcess, 10000) == WAIT_TIMEOUT) {
			}
            MessageBox(NULL, "weiter", "", MB_OKCANCEL);
		}

		_tprintf( TEXT("\n  Process ID        = 0x%08X"), pe32.th32ProcessID );
		_tprintf( TEXT("\n  Thread count      = %d"),   pe32.cntThreads );
		_tprintf( TEXT("\n  Parent process ID = 0x%08X"), pe32.th32ParentProcessID );
		_tprintf( TEXT("\n  Priority base     = %d"), pe32.pcPriClassBase );

		if( dwPriorityClass ){
			_tprintf( TEXT("\n  Priority class    = %d"), dwPriorityClass );
		}
		// List the modules and threads associated with this process
		ListProcessModules( pe32.th32ProcessID );
		ListProcessThreads( pe32.th32ProcessID );
	}
 
Hi.

Was willst du denn nun machen? Warum sollte sich der Prozess jetzt beenden? Du besorgst dir ein Handle, liest die Priorität aus und schließt das Handle wieder. Danach greifst du weiter auf das Handle zu. Das macht keinen Sinn.

Ich dachte du willst Apache ordentlich herunterfahren? Willst du den Prozess einfach abschießen?

Gruß
 
Hey ;-)

hab auch grad gemerkt dass man ja mit closeHandle gar nicht den Prozess herunterfährt sondern nur schließt. Sagt der Name ja eigentlich auch aus ;-) weiß auch nicht, hatte grad wohl nen Brett vor dem Kopf.

Stimmt will ihn ordentlich herunterfahren. Wenn ich nur wüsste, wie ich das dem Prozess sagen kann. Mit TerminateProcess wird er da ordentlich heruntergefahren oder ist das mehr ein schnelles Killen des Prozesses. Was gebe ich eigentlich als Rechte bei open_process am besten an, dass es unter XP und Vista läuft? Ich dachte ich muss eigentlich CreateProcess machen, um den APache herunterzufahren und dann müsste ich ja eigentlich warten bis hProcess wirklich beendet ist. aber irgendwie passt das noch nicht so ganz, kopiere dir nochmal meinen geänderten Code hierrein.

Code:
	if(strcmp(pe32.szExeFile, "Apache.exe")==0){
		MessageBox(NULL, pe32.szExeFile, "", MB_OKCANCEL);
		hProcess = OpenProcess( PROCESS_CREATE_PROCESS, FALSE, pe32.th32ProcessID );
		if( hProcess == NULL ){
			printError( TEXT("OpenProcess") );
		}else
		{
			MessageBox(NULL, "ungelcih null", "", MB_OKCANCEL);
			dwPriorityClass = GetPriorityClass( hProcess );
			/*if( !dwPriorityClass )
			//printError( TEXT("GetPriorityClass") );
			MessageBox(NULL, "GetPriorityClass", "", MB_OKCANCEL);
			*/

			PROCESS_INFORMATION piA;
			STARTUPINFO suiA;
			suiA.cb		=sizeof(STARTUPINFO);
			suiA.lpReserved	=0;
			suiA.lpDesktop	=NULL;
			suiA.lpTitle	=NULL;
			suiA.dwX		=0;
			suiA.dwY		=0;
			suiA.dwXSize	=0;
			suiA.dwYSize	=0;
			suiA.dwXCountChars	=0;
			suiA.dwYCountChars	=0;
			suiA.dwFillAttribute	=0;
			suiA.dwFlags	=STARTF_USESHOWWINDOW;
			suiA.wShowWindow	=SW_MINIMIZE;
			suiA.cbReserved2	=0;
			suiA.lpReserved2	=0;
			if(CreateProcess(NULL,strApacheShutdown,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE|NORMAL_PRIORITY_CLASS,NULL,NULL,&suiA,&piA)==TRUE) {
				CloseHandle(piA.hThread);
			}
			else {
				//exit(-1);
			}

			WaitForInputIdle(piA.hProcess, INFINITE);
			while(WaitForSingleObject(piA.hProcess, 10000) == WAIT_TIMEOUT) {
			}
			WaitForInputIdle(hProcess, INFINITE);
			while(WaitForSingleObject(hProcess, 10000) == WAIT_TIMEOUT) {
			}
			//MessageBox(NULL, "weiter", "", MB_OKCANCEL);
			if(CloseHandle( hProcess )==0){
			//	MessageBox(NULL, "nicht beendet", "", MB_OKCANCEL);
			}else{
			//	MessageBox(NULL, "beendet", "", MB_OKCANCEL);
			}
            //MessageBox(NULL, "weiter", "", MB_OKCANCEL);
		}

		if( dwPriorityClass ){
			_tprintf( TEXT("\n  Priority class    = %d"), dwPriorityClass );
		}
		// List the modules and threads associated with this process
		ListProcessModules( pe32.th32ProcessID );
		ListProcessThreads( pe32.th32ProcessID );
	}

Vielleicht kannst du mir sagen, was nicht passt, bzw irgendwie scheint es schon zu passen, irgendwann beenden sich die Apache.exe aber viel später wie ich möchte, v.a. möchte ich ja sozusagen abwarten bis er heruntergefahren ist und anschließend die log-Dateien vom Apache löschen, die sich ja erst löschen lassen, wenn er wirklich heruntergefahren ist und deswegen muss ich den Zeitpunkt herausfinden.

Gruß
 
Das Beenden von Apache über "apache -k stop" funktioniert nur wenn Apache als Service registriert ist. Ist das bei dir der Fall? Hast du denn das mal per Hand ausprobiert, ob es klappt bevor du versuchst das in dein Programm einzubauen?

Was ist dann der Return-Code des "strApacheShutdown" Befehls?

Ich habe irgendwie immer noch nicht ganz verstanden welches Problem du versuchst zu lösen. Was ist denn das Ziel des Programmes bzw. worin unterscheidet es sich von anderen Programmen (pskill)?

Gruß
 
Also ich habe probiert den Apache mit apache -k shutdown herunterzufahren, das klappt

Im strApacheShutdown steht folgendes: PfadzumApache\Apache.exe -f Pfad zu httpd\httpd.conf -k shutdown

Also das Problem ist folgendes: wir haben eine start.exe, in der ein paar Sachen geprüft bzw gesetzt werden, die wir für die Software brauchen, dann wird der Apache gestartet und anschließend der Internet Explorer mit einer Startseite gestartet. Im start-exe-Programm hatten wir es so programmiert dass der Apache solange läuft bis der Internet Explorer geschlossen wird. Dies hat bei XP einwandfrei funktioniert, aber bei Vista geht es nicht, weil der Prozess vom IE wohl schon kurz nach dem Starten geschlossen wird. Ich hatte da recht lange gegoogelt und da haben die meisten geschrieben, dass das Sicherheitskonzept bei Vista anders ist und der Prozess daher dann schon am Anfang beendet wird und man den nicht so einfach überwachen kann. Daher dachten wir dass wir auf unserer Software einfach einen Button einfügen, über den dann die Seite geschlossen wird und der Apache heruntergefahren wird und die log-Dateien vom Apache gelöscht werden sollen, zusätzlich müsste eben noch die Kopf-/Fußzeile auf den Wert gesetzt werden, bevor das Programm lief, sonst hätten wir das auch einfach über eine .bat-Datei machen können.

Ich hoffe du kannst jetzt verstehen was ich machen möchte :)
Gruß
 
Und wozu willst du den Apache Prozeß finden? Ich dachte anfangs du willst den Pfad zur Apache .exe ermitteln, aber wie es aussieht kannst du davon ausgehen, dass du den Pfad kennst.

So wie ich das sehe würde doch reichen:
C:
int ret = system(strApacheShutdown);
if (ret == 0) {
  // erfolgreich gestoppt.
} else if (ret == 2) {
  // Fehler. Service nicht installiert
} else {
  // anderer Fehler, Datei nicht gefunden...
}
Gruß
 
Zurück