Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi prozess in Taskmanager beenden aber wie ? (https://www.delphipraxis.net/5512-prozess-taskmanager-beenden-aber-wie.html)

matrix68 9. Jun 2003 19:38


prozess in Taskmanager beenden aber wie ?
 
Hallo,

ich würde gerne mal wissen wie man Systemprozesse beenden kann ?
Prozesse wie "Spoolsv.exe" lassen sich nur mit der Maus schliesen.
Habe mich schon überall umgeschaut und keine lösung dazu gefunden.
Ich habe es mit diesen Beispiel code probiert:

Delphi-Quellcode:
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess( 
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;



{ For Windows NT/2000/XP } 

procedure KillProcess(hWindowHandle: HWND);
var
  hprocessID: INTEGER;
  processHandle: THandle;
  DWResult: DWORD;
begin
  SendMessageTimeout(hWindowHandle, WM_CLOSE, 0, 0,
    SMTO_ABORTIFHUNG or SMTO_NORMAL, 5000, DWResult);

  if isWindow(hWindowHandle) then
  begin
    // PostMessage(hWindowHandle, WM_QUIT, 0, 0);

    { Get the process identifier for the window} 
    GetWindowThreadProcessID(hWindowHandle, @hprocessID);
    if hprocessID <> 0 then
    begin
      { Get the process handle } 
      processHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION,
        False, hprocessID);
      if processHandle <> 0 then
      begin
        { Terminate the process } 
        TerminateProcess(processHandle, 0);
        CloseHandle(ProcessHandle);
      end;
    end;
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
begin
   KillTask('spoolsv.exe');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
   KillProcess(FindWindow('spoolsv.exe',nil));
end;

end.
Es läuft ohne Fehlermeldung aber "spoolsv.exe" ist immer noch aktiv
in Taskmanager !!!.
Wenn ich andere Prozesse schliessen will,z.b die auf user laufen
geht ohne weiteres.
Kann mir jemand helfen ?

gruss

Matrix

[edit=Daniel B]Delphi-Tags eingefügt. MfG Daniel B.[/edit]

Luckie 9. Jun 2003 20:28

Bist du sicher, dass der Druck-Spooler ein Fenster hat? Und wenn ja meinst du das Fenster hat den Klassennamen: "spoolsv.exe"? Das glaube ich nämlich nicht. Ich denke übrigens, dass das ein Service ist und der läßt sich nicht so ohne weiteres beenden / abschiessen.

matrix68 9. Jun 2003 21:27

Zitat:

Zitat von Luckie
Bist du sicher, dass der Druck-Spooler ein Fenster hat? Und wenn ja meinst du das Fenster hat den Klassennamen: "spoolsv.exe"? Das glaube ich nämlich nicht. Ich denke übrigens, dass das ein Service ist und der läßt sich nicht so ohne weiteres beenden / abschiessen.

Hi Luckie,

mit der Maus kannst du es ohne weiteres beenden,
sehe kein problem.
Mich würde es viel mehr intresieren ob man es auch mit Delphi beenden
kann.

Matrix68

Luckie 9. Jun 2003 21:44

Also ich kann es nicht mit meiner SysInfo. Und kuck, wie ich Prozesse beende. Bestimmte Prozesse von Windows kann man nicht beenden.

Und was meinst du "mit der Maus kann man ihn beenden". Ich kann den Prozess auch mit dem Taskmanger von Windows nicht beenden.

Motzi 10. Jun 2003 06:51

Sofern man das SE_DEBUG_PRIVILEGE aktiviert hat (als Admin steht einem dieses Privilege zwar zur Verfügung, allerdings ist es standardmäßig deaktiviert), dann kann man sich auch für Services ein gültiges Prozess-Handle holen und den Prozess über dieses Handle "abschießen".

aaron 10. Jun 2003 11:42

'spoolsv.exe' ist ein dienst von windows 2000/xp und kann in > systemsteuerung > verwaltung > computerverwaltung > dienste >
unter DRUCKERWARTESCHLANGE beendet werden...

CalganX 10. Jun 2003 11:56

Zitat:

Zitat von aaron
'spoolsv.exe' ist ein dienst von windows 2000/xp und kann in > systemsteuerung > verwaltung > computerverwaltung > dienste >
unter DRUCKERWARTESCHLANGE beendet werden...

In diesem Fall wird allerdings der Service "heruntergefahren" und nicht abgeschossen, was matrix68 allerdings vorhat ist den Service einfach brutal zu töten.

Allerdings würde ich dir empfehlen das nicht zu machen, da es eigentlich kein Sinn macht. Wenn du allerdings einfach den Service ausschalten willst, dann solltest du nach einer Lösung suchen Services zu beenden (regulär).

Chris

matrix68 10. Jun 2003 21:03

eigentlich wollte ich nur wissen ob es möglich ist
über Delphi solche prozesse abzuschiessen bzw. zu beenden ?
Ob es Sin macht oder nicht,das muß jeder für sich selbst beantworten.
Also frage ich noch einmal.. ist es möglich oder nicht ?
Wenn ja wie ?

gruss

Matrix68

P.S: Alt + Strg + Entf drücken Taskmanager wird geöffnet.
Mit der Maus Spoolsv.exe auswählen und Prozess beenden.
fertig....

Luckie 10. Jun 2003 21:25

Zitat:

Zitat von matrix68
P.S: Alt + Strg + Entf drücken Taskmanager wird geöffnet.
Mit der Maus Spoolsv.exe auswählen und Prozess beenden.
fertig....

Und genau das geht bei mir unter 2000 nicht, obwohl ich Admin bin.

Christian Seehase 10. Jun 2003 23:21

Moin Zusammen,

Zitat:

Zitat von Matrix68
P.S: Alt + Strg + Entf drücken Taskmanager wird geöffnet.
Mit der Maus Spoolsv.exe auswählen und Prozess beenden.
fertig....

Zitat:

Zitat von Luckie
Und genau das geht bei mir unter 2000 nicht, obwohl ich Admin bin.

was damit zusammenhängt, dass Dienste die im Kontext des Accounts System (bzw. LocalSystem) gestartet wurden, auch nicht mit Adminrechten "abgewürgt" werden dürfen.
Würde man das ändern (nur warum sollte man) würde es gehen.

matrix68 11. Jun 2003 00:47

habe verstanden... danke ! :spin:

Matrix68

Motzi 11. Jun 2003 06:42

Zitat:

Zitat von Christian Seehase
Moin Zusammen,

Zitat:

Zitat von Matrix68
P.S: Alt + Strg + Entf drücken Taskmanager wird geöffnet.
Mit der Maus Spoolsv.exe auswählen und Prozess beenden.
fertig....

Zitat:

Zitat von Luckie
Und genau das geht bei mir unter 2000 nicht, obwohl ich Admin bin.

was damit zusammenhängt, dass Dienste die im Kontext des Accounts System (bzw. LocalSystem) gestartet wurden, auch nicht mit Adminrechten "abgewürgt" werden dürfen.
Würde man das ändern (nur warum sollte man) würde es gehen.

Wie gesagt.. mit aktiviertem Debug-Privilege geht es! Standardmäßig ist dieses jedoch deaktiviert (auch beim Taskmanager)!

Luckie 11. Jun 2003 07:35

Ja genau, davon rede ich ja. Ich kann mir aber nicht vorstellen, dass er die selbigen hat bzw. sie sich vorher geholt hat.

Delphi-Laie 25. Dez 2009 23:03

Zitat:

Zitat von Luckie
Also ich kann es nicht mit meiner SysInfo. Und kuck, wie ich Prozesse beende. Bestimmte Prozesse von Windows kann man nicht beenden.

Und was meinst du "mit der Maus kann man ihn beenden". Ich kann den Prozess auch mit dem Taskmanger von Windows nicht beenden.

Aber Dein EnumProcesses kann, wie auch der Prozessmonitor von Sysinternals, einige Systemprozesse beenden (s.hier). Wie gelangt es zu dieser beneidenswerten Fähigkeit?

Luckie 26. Dez 2009 03:16

Re: prozess in Taskmanager beenden aber wie ?
 
Guck dir den Code an, der sollte dabei sein.

Delphi-Laie 26. Dez 2009 11:02

Re: prozess in Taskmanager beenden aber wie ?
 
Zitat:

Zitat von Luckie
Guck dir den Code an, der sollte dabei sein.

Ja, ist er natürlich.... hm, was Du nicht unbedingt wissen kannst: Bevor ich in Foren frage (das letzte Mal ist schon eine geraume Weile her), strapaziere ich die Forensuche und Quelltexte durchaus beträchtlich, denn vom unnötigen, der eigenen Bequemlichkeit geschuldeten Schmarotzen bin ich auch kein Freund. Doch selbst dabei ist man nicht immer erfolgreich, zumal nicht alles restlos selbsterklärend ist. Ein kurzes Stichwort von Dir hätte mir ja genügt. Nun, ich bin der Sache noch einmal nachgegangen und glaube (!), den relevanten Code im Quelltext gefunden zu haben. Wen es interessiert, wie man auch auf verschiedene - die meisten - Systemprozesse den gewünschten Zugriff hat, dem seien für den Quelltext Deines EnumProcesses die Stichwörter:

- EnableDebugPrivilege
- EnableDebugPrivileges

genannt; das sollte die richtige Fährte sein. Falls nicht, dann mich bitte korrigieren, Luckie.

Luckie 26. Dez 2009 13:55

Re: prozess in Taskmanager beenden aber wie ?
 
Das kann es schon sein. Ich kenne deinen Quellcode nicht. Du musst eben nur gucken, wa sich anders mache. Deswegen kann ich da keine Tipps geben, warum es bei mir klappt und bei dir nicht.

Delphi-Laie 26. Dez 2009 14:02

Re: prozess in Taskmanager beenden aber wie ?
 
Zitat:

Zitat von Luckie
Das kann es schon sein. Ich kenne deinen Quellcode nicht. Du musst eben nur gucken, wa sich anders mache. Deswegen kann ich da keine Tipps geben, warum es bei mir klappt und bei dir nicht.

Luckie, es ging nicht um meinen, sondern um Deinen Quellcode, nämlich den vom EnumProcesses. Und daß man mit einem simplen TerminateProcess eben nicht alle, nämlich nicht die Systemprozesse überzeugen kann, weißt Du gewiß besser als ich. Allerdings ist mir der Aufwand zum - ohnehin unnötigen - Beenden der Systemprozesse, jedenfalls nach Deinem Quelltext, einfach zu groß. Ich hätte es zwar als Enthusiast gern in mein Programm aufgenommen, aber das lohnt sich dann doch wieder nicht.

Luckie 26. Dez 2009 14:04

Re: prozess in Taskmanager beenden aber wie ?
 
Ich weiß, dass es um meinen Quellcode geht. Aber woher soll ich wissen, warum mein Programm mehr Prozesse beenden kann, als dein, wenn ich deinen Quellcode nicht kenne. Du kennst beide und nur du kannst den Unterschied finden.

Delphi-Laie 26. Dez 2009 15:00

Re: prozess in Taskmanager beenden aber wie ?
 
Zitat:

Zitat von Luckie
Ich weiß, dass es um meinen Quellcode geht. Aber woher soll ich wissen, warum mein Programm mehr Prozesse beenden kann, als dein, wenn ich deinen Quellcode nicht kenne. Du kennst beide und nur du kannst den Unterschied finden.

Luckie, es ging mir überhaupt nicht um meinen Quellcode oder um den Vergleich Deines Quellcoes mit meinem - das brachtest Du erst hier ins Spiel. Meine Frage bezog sich einzig und allein nur auf Deinen Quellcode, nämlich konkret, wo das Geheimnis des Zugriffes auf Systemprozesse mehr oder weniger verborgen ist.

Daß es mit einem simplen TerminateProcess bei Systemprozessen nicht getan ist, mußt Du besser wissen als ich. Die dafür nötigen Unterprogramm wie EnableDebugPrivilege und EnableDebugPrivileges, die das aufzuheben scheinen, dürften einiges an Programmierstunden gekostet haben. Du willst mir doch sicher nicht kredenzen, daß die zufällig in Deinen Quellcode gelangt sind?!

Luckie 26. Dez 2009 15:04

Re: prozess in Taskmanager beenden aber wie ?
 
Zitat:

Zitat von Delphi-Laie
daß die zufällig in Deinen Quellcode gelangt sind?!

Mist, ich dachte, ich könnte es noch etwas länger geheim halten. :(

Delphi-Laie 26. Dez 2009 15:12

Re: prozess in Taskmanager beenden aber wie ?
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von Delphi-Laie
daß die zufällig in Deinen Quellcode gelangt sind?!

Mist, ich dachte, ich könnte es noch etwas länger geheim halten. :(

Aha, so einer bist Du also?! :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz