Prozesse auslesen

Habe jetzt nochmal eine Frage, habe bisher das Programm ja nur mittels klick auf die exe getestet, habe es jetzt mal in das Programm integriert, in dem ich es verwenden möchte und anscheinend wird die Internet Explorer Seite zu langsam geschlossen bzw alle Prozesse die dazugehören, so dass er bei system Probleme macht
Dann mach einfach mehrere Versuche.

Gruß
 
Weil du meintest ich soll sonst einfach mehrere Versuche machen, wenn ich das mit system eingebunden habe, kommt folgende Fehlermeldung, daher hab ich dann doch wieder zu der GetProcessFile()-Version tendiert. Aber vielleicht weißt du ja auch was ich falsch gemacht habe.

Gruß
 

Anhänge

  • Zwischenablage01.jpg
    Zwischenablage01.jpg
    51 KB · Aufrufe: 5
Weil du meintest ich soll sonst einfach mehrere Versuche machen, wenn ich das mit system eingebunden habe, kommt folgende Fehlermeldung, daher hab ich dann doch wieder zu der GetProcessFile()-Version tendiert. Aber vielleicht weißt du ja auch was ich falsch gemacht habe.
Du hast offenbar einfach einen leeren String an die system() Funktion übergeben. Das macht keinen Sinn.

Gruß
 
Laut MSDN:

Evtl. ist das das Problem.

Hast du das wirklich ausprobiert? Das kann ich mir eigentlich nicht vorstellen, der "net stop" Befehl wartet eigentlich extrem lange bis ein Service wirklich gestoppt wurde.
Es lag daran dass ich PROCESS_CREATE_PROCESS verwendet hatte, anstatt SYNCHRONIZE. Dadurch kommt jetzt kein ACCESS DENIED mehr und er wartet wirklich bis er heruntergefahren ist, zumindest wenn ich es per Klick auf exe und nicht auf den Button ausführe.
Generell ist es besser etwas einfach zu versuchen und dann zu prüfen ob es geklappt hat. Vorher zu prüfen ob die Datei da ist kann man sich sparen, man weiß dann ja trotzdem nicht ob das Löschen erfolgreich ist. Wenn du ERROR_FILE_NOT_FOUND zurück bekommst, dann ist doch auch OK.
<
stimmt schon ;)

Als Service wird der Apache vermutlich unter einem System-Konto ausgeführt, eben nicht unter dem gleichen Konto.
Nein da der Apache mit dem Anklicken einer exe gestartet wird, wird er sozusagen mit dem gleichen Konto ausgeführt.

Was ist wenn der Apache nicht runterfährt? Willst du ewig auf das Beenden vom Häuptling warten?
Nein will ich natürlich nicht, wenn ich ihn nicht herunterfahren kann, dann läuft er halt weiter. Daher hatte ich ja auch nur 2 Sekunden als Timeout eingestellt und nicht INFINITE, zumindest in der eigentlichen Version. Kann sein dass ichs zwischendurch mal geändert hatte, aber jetzt hab ichs so geändert:

Code:
if(strcmp(pe32.szExeFile, "Apache.exe")==0){
		hProcess = OpenProcess( SYNCHRONIZE , FALSE, pe32.th32ProcessID );
		if( hProcess == NULL ){
			printError( TEXT("OpenProcess") );
		}else
		{
			dwPriorityClass = GetPriorityClass( hProcess );

			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);
			}
			

			WaitForInputIdle(piA.hProcess, INFINITE);
			while(WaitForSingleObject(piA.hProcess, 10000) == WAIT_TIMEOUT) {
			}

			WaitForInputIdle(hProcess, INFINITE);
			while(WaitForSingleObject(hProcess, 2000) == WAIT_TIMEOUT) {
			}

			CloseHandle( hProcess );
		}		
	}

Ich hatte Sleep() immer klein geschrieben, deswegen ging es nicht ;-) Danke für dein Code-Beispiel. Muss ich mal versuchen bei mir beim Löschen einzubinden. Das mit dem system werde ich auch so mal ausprobieren, aber anscheinend mag er das ja nicht aus javascript heraus. (siehe Screenshot von vorherigem Beitrag von mir)

Hast du eine Idee woran es liegen könnte, dass es funktioniert, wenn ich die exe per Maus-Klick ausführe, wenn ich aber einen Button klicke und dann sage

document.location.href="http://localhost/cgi-bin/test.exe";

dann beendet er den Apache auf einmal nicht mehr

Viele Grüße
 
Du hast offenbar einfach einen leeren String an die system() Funktion übergeben. Das macht keinen Sinn.

Gruß
Du hast natürlich recht! Ich habe jetzt mal vorher ein paar MessageBox-Ausgaben gemacht, wenn ich die exe per Klick ausführe, dann sagt er mir dass mein Temp-File unter C:\Documents and Settings\UserName\Local Settings\Temp ist, wenn ich die exe über den Button ausführe, dann sagt er mir bei GetTempPath, dass das C:\Windows wäre und da findet er dann meine log-Datei nicht, in der der Pfad zum Apache steht (in der unter anderem steht wie die Kopf-/Fußzeile vor dem Ausführen der start.exe war, damit er sie zurücksetzen kann) ;) Siehst du da eine Möglichkeit, dass er auch vom Button aus das Temp-Verzeichnis unter Documents and Settings findet?

Gruß und vielen lieben Dank für deine Hilfe
 
Nein da der Apache mit dem Anklicken einer exe gestartet wird, wird er sozusagen mit dem gleichen Konto ausgeführt.
Dann wird er nicht als Service gestartet und kann demnach auch nicht über die -k shutdown Methode beendet werden.

Vermutlich startest du aber über -k start, womit der Apache als Service unter dem in den Serviceeigenschaften eingestellten lokalen Systemkonto gestartet wird?!
Nein will ich natürlich nicht, wenn ich ihn nicht herunterfahren kann, dann läuft er halt weiter. Daher hatte ich ja auch nur 2 Sekunden als Timeout eingestellt und nicht INFINITE, zumindest in der eigentlichen Version. Kann sein dass ichs zwischendurch mal geändert hatte, aber jetzt hab ichs so geändert:

Code:
if(strcmp(pe32.szExeFile, "Apache.exe")==0){
		hProcess = OpenProcess( SYNCHRONIZE , FALSE, pe32.th32ProcessID );
		if( hProcess == NULL ){
			printError( TEXT("OpenProcess") );
		}else
		{
			dwPriorityClass = GetPriorityClass( hProcess );

			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);
			}
			

			WaitForInputIdle(piA.hProcess, INFINITE);
			while(WaitForSingleObject(piA.hProcess, 10000) == WAIT_TIMEOUT) {
			}

			WaitForInputIdle(hProcess, INFINITE);
			while(WaitForSingleObject(hProcess, 2000) == WAIT_TIMEOUT) {
			}

			CloseHandle( hProcess );
		}		
	}
Damit wartest du aber trotzdem ewig, da die Schleife ja nur abgebrochen wird, wenn ein Fehler auftritt oder der Apache beendet wurde.
Ich hatte Sleep() immer klein geschrieben, deswegen ging es nicht ;-) Danke für dein Code-Beispiel. Muss ich mal versuchen bei mir beim Löschen einzubinden. Das mit dem system werde ich auch so mal ausprobieren, aber anscheinend mag er das ja nicht aus javascript heraus. (siehe Screenshot von vorherigem Beitrag von mir)
Der Screenshot sagt nur aus, das du irgendwelchen Mist gemacht hast. (siehe Beitrag #43)
Hast du eine Idee woran es liegen könnte, dass es funktioniert, wenn ich die exe per Maus-Klick ausführe, wenn ich aber einen Button klicke und dann sage

document.location.href="http://localhost/cgi-bin/test.exe";

dann beendet er den Apache auf einmal nicht mehr
Wenn du die .exe als CGI Programm (und damit als Kindprozess vom Apache) ausführen läßt, dann wartet der Apache auf die Beendigung dieses Prozesses während dein Programm auf die Beendigung vom Apache wartet. Blöd... :eek:

Du müßtest dein Programm von deinem Programm aus nochmal starten.

Gruß
 
Dann wird er nicht als Service gestartet und kann demnach auch nicht über die -k shutdown Methode beendet werden.

Vermutlich startest du aber über -k start, womit der Apache als Service unter dem in den Serviceeigenschaften eingestellten lokalen Systemkonto gestartet wird?!
Genau so ist es :)

Damit wartest du aber trotzdem ewig, da die Schleife ja nur abgebrochen wird, wenn ein Fehler auftritt oder der Apache beendet wurde.
wie wäre es dann besser? Wobei ich ja deine Lösung über system momentan bevorzuge, jedoch habe ich ja das Problem mit dem Temp-Verzeichnis, wobei das natürlich beide Lösungen trifft, da ich über die log.txt im Temp-Verzeichnis des Users den APacheShutDown-Befehl beim Starten speichern lasse, damit man weiß wie der Apache gestartet wurde.

Der Screenshot sagt nur aus, das du irgendwelchen Mist gemacht hast. (siehe Beitrag #43)
Stimmt, das kommt davon dass er bei GetTempPath C:\Windows zurückgibt, anstatt das Temp-Verzeichnis des Users, nur wieso könnte das so sein?

Wenn du die .exe als CGI Programm (und damit als Kindprozess vom Apache) ausführen läßt, dann wartet der Apache auf die Beendigung dieses Prozesses während dein Programm auf die Beendigung vom Apache wartet. Blöd... :eek:
Ich dachte in das cgi-bin-Verzeichnis kann man ausführbare Dateien kopieren, die man mit Hilfe von localhost dann ausführen lassen kann.

Du müßtest dein Programm von deinem Programm aus nochmal starten.
Verstehe ich nicht ganz, wie müsste ich das denn machen? Ich wollte eigetnlich über einen Button das FEnster mit top.window.close(); schließen und anschließend die exe ausführen, um den Apache zu beenden, die logs zu löschen und die Kopf-/Fußzeile auf den vorherigen Wert setzen, da der Kunde für dieses Projekt ganz spezielle Vorstellungen für KOpf-/Fußzeile hat, die er nach dem Beenden des Programmes aber nicht mehr haben sollte. Hast du eine Idee, wie man das besser lösen könnte wie bisher? also wie es besser wäre, anstatt bei ButtonClick erst das Fenster zu schließen und dann document.location.href="http://localhost/cgi-bin/test.exe"; auszuführen?

Viele Grüße
 
wie wäre es dann besser?
Überleg doch mal. Wozu die Schleife?
Wobei ich ja deine Lösung über system momentan bevorzuge, jedoch habe ich ja das Problem mit dem Temp-Verzeichnis, wobei das natürlich beide Lösungen trifft, da ich über die log.txt im Temp-Verzeichnis des Users den APacheShutDown-Befehl beim Starten speichern lasse, damit man weiß wie der Apache gestartet wurde.


Stimmt, das kommt davon dass er bei GetTempPath C:\Windows zurückgibt, anstatt das Temp-Verzeichnis des Users, nur wieso könnte das so sein?
Weil der Apache nicht unter dem User ausgeführt wird, sondern unter dem lokalen Systemkonto.
Ich dachte in das cgi-bin-Verzeichnis kann man ausführbare Dateien kopieren, die man mit Hilfe von localhost dann ausführen lassen kann.
Habe ich etwas anderes behauptet? Evlt. solltest du dich mal informieren was CGI ist.
Verstehe ich nicht ganz, wie müsste ich das denn machen?
Ungefähr so:
C:
int main(int argc, char argv[]) {
  // wenn als CGI Programm ausgeführt
  if (getenv("REMOTE_HOST") != NULL) {
    char env[256];
    sprintf(env, "COMSPEC=%s%c%c",
                getenv("COMSPEC"), '\0', '\0');
    puts("Content-type: text/plain\n\n"
           "shutting down...");
    fclose(stdout);
    // dieses Programm als Kindprozess starten, mit
    ...
    CreateProcess(argv[0], NULL, ...,
        FALSE, // inherit HANDLES
        ...
        env,  // Environment
        ...);
  } else {
     // wie bisher.
  }
}
Gruß
 
Zuletzt bearbeitet:
Überleg doch mal. Wozu die Schleife?
ich dachte er wartet bei: while(WaitForSingleObject(hProcess, 2000) == WAIT_TIMEOUT) {} 2 Sekunden lang ob der Apache heruntergefahren wurde, wenn nicht geht er eh in den Wait_timeout?

Weil der Apache nicht unter dem User ausgeführt wird, sondern unter dem lokalen Systemkonto.
Aber ich starte den Apache doch über eine start.exe mit CreateProcess und apache -k start Wieso wird der Apache dann unter dem lokalen Systemkonto ausgeführt, wenn ich start.exe ausführe, startet er es doch auch im Documents&Settings/Username/Local Settings/Temp-Verzeichnis und im TaskManager steht der Prozess doch auch unter meinem usernamen. Scheint für mich ja daran zu liegen von wo aus ich die shutdown.exe starte. Wenn ich sie per Hand anklicke, funktioniert es und er sagt mir dass das TempVerzeichnis unter dem Usernamen ist, wenn ich es über den Button ausführe, dann sagt er mit ja C:\Windows (ohne Temp hintendran). Wenn ich nur wüsste, wie man das ändern könnte

Habe ich etwas anderes behauptet? Evlt. solltest du dich mal informieren was CGI ist.
Dann habe ich dich falsch verstanden. Sorry!

Ungefähr so:
C:
int main(int argc, char argv[]) {
  // wenn als CGI Programm ausgeführt
  if (getenv("REMOTE_HOST") != NULL) {
    char env[] = "\0\0";
    puts("Content-type: text/plain\n\n"
           "shutting down...");
    fclose(stdout);
    // dieses Programm als Kindprozess starten, mit
    ...
    CreateProcess(argv[0], NULL, ...,
        FALSE, // inherit HANDLES
        ...
        env,  // Environment
        ...);
  } else {
     // wie bisher.
  }
}
Gruß
Wenn ich das Programm per Hand anklicke, geht er genauso wie wenn ichs über den Button ausführe in den else-Zweig. Es liegt wohl auf jeden Fall erstmal daran dass ich nicht den richtigen Temp-Pfad bei GetTempPath zurückbekomme, so dass strApacheShutdown leer ist, wenn ich das Programm über den CGI-Aufruf/Button beenden möchte und es nicht funktioniert.

Gruß
 
ich dachte er wartet bei: while(WaitForSingleObject(hProcess, 2000) == WAIT_TIMEOUT) {} 2 Sekunden lang ob der Apache heruntergefahren wurde, wenn nicht geht er eh in den Wait_timeout?
Du hast dort eine Schleife. Und du rufst WaitForSingleObject immer wieder auf und wartest immer wieder 2 Sek. solange WAIT_TIMEOUT zurückkommt.
Aber ich starte den Apache doch über eine start.exe mit CreateProcess und apache -k start Wieso wird der Apache dann unter dem lokalen Systemkonto ausgeführt, wenn ich start.exe ausführe, startet er es doch auch im Documents&Settings/Username/Local Settings/Temp-Verzeichnis und im TaskManager steht der Prozess doch auch unter meinem usernamen.
Nochmal: Du startest den Apache als Service. Demnach wird er unter dem Konto ausgeführt welches in den Serviceeigenschaften hinterlegt ist. Normalerweise ist das NT-Autorität\SYSTEM (und das ist auch gut so).

Es ist völlig unerheblich wie du den Apache startest und unter welchem Konto deine start.exe läuft.
Scheint für mich ja daran zu liegen von wo aus ich die shutdown.exe starte. Wenn ich sie per Hand anklicke, funktioniert es und er sagt mir dass das TempVerzeichnis unter dem Usernamen ist, wenn ich es über den Button ausführe, dann sagt er mit ja C:\Windows (ohne Temp hintendran). Wenn ich nur wüsste, wie man das ändern könnte
Wieso willst du das ändern?
Wenn ich das Programm per Hand anklicke, geht er genauso wie wenn ichs über den Button ausführe in den else-Zweig. Es liegt wohl auf jeden Fall erstmal daran dass ich nicht den richtigen Temp-Pfad bei GetTempPath zurückbekomme, so dass strApacheShutdown leer ist, wenn ich das Programm über den CGI-Aufruf/Button beenden möchte und es nicht funktioniert.
Was hat denn der strApacheShutdown mit dem TempPath zu tun?

Gruß
 
Zurück