Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   z.B. Taskkill erkennen (https://www.delphipraxis.net/198924-z-b-taskkill-erkennen.html)

ADelph 11. Dez 2018 12:01

z.B. Taskkill erkennen
 
Moin,

ist es irgendwie möglich, in einem Delphi-Programm den Abbruch durch z.B. taskkill zu erkennen? Mir geht es darum z.B. noch 'hängende' Transaktionen etc. sauber beenden zu können, wenn ein Programm aus anderen Gründen hängen sollte und per z.B. Taskmanager 'abgeschossen' werden soll. Kann ich da irgendeine Message abfangen?

Hinweise sind sehr willkommen ;-)

DieDolly 11. Dez 2018 12:03

AW: z.B. Taskkill erkennen
 
Ich würde stetig prüfen, ob der Prozess noch existiert. Wenn nicht, wurde er abgeschossen oder anders beendet.

Schokohase 11. Dez 2018 12:04

AW: z.B. Taskkill erkennen
 
Zitat:

Zitat von ADelph (Beitrag 1420593)
ist es irgendwie möglich, in einem Delphi-Programm den Abbruch durch z.B. taskkill zu erkennen?

Nein. Dem Prozess wird einfach hart der Saft abgedreht.

DieDolly 11. Dez 2018 12:11

AW: z.B. Taskkill erkennen
 
Das Nein war vermutlich darauf bezogen, dass du keine Message bekommst wenn ein Task hart beendet wird.
Aber warum eine Message abfangen wollen, wenn man einfach auf Existenz eines Prozesses prüfen kann.

Ob ein Prozess hängt wird glaube ich schwieriger. Wenn es dein eigenes Programm ist was hängt, gibt es irgendwo nicht behandelte oder richtig behandelte Fehler im Code.

Neutral General 11. Dez 2018 12:29

AW: z.B. Taskkill erkennen
 
Zitat:

Zitat von DieDolly (Beitrag 1420598)
Das Nein war vermutlich darauf bezogen, dass du keine Message bekommst wenn ein Task hart beendet wird.
Aber warum eine Message abfangen wollen, wenn man einfach auf Existenz eines Prozesses prüfen kann.

Ob ein Prozess hängt wird glaube ich schwieriger. Wenn es dein eigenes Programm ist was hängt, gibt es irgendwo nicht behandelte oder richtig behandelte Fehler im Code.

Ich glaube er redet davon IN seinem Programm zu erkennen wenn das Programm selbst abgeschossen wird, nicht ein fremdes Programm.

Die einzige Möglichkeit die mir einfällt, die funktionieren könnte wäre TerminateProcess global zu hooken.
Das ist aber ne größere Aktion.

Ansonsten gilt:
Zitat:

Zitat von https://docs.microsoft.com/en-us/windows/desktop/api/processthreadsapi/nf-processthreadsapi-terminateprocess
A process cannot prevent itself from being terminated.


ADelph 11. Dez 2018 13:03

AW: z.B. Taskkill erkennen
 
Moin,

danke für die schnellen Antworten!

Ich hatte mir schon gedacht, dass es nicht einfach geht, bzw. gar nicht gehen könnte...schade, wäre nützlich...

sh17 11. Dez 2018 13:11

AW: z.B. Taskkill erkennen
 
Wie machen es die Prozesse, die man nicht killen kann? Laufen die in einem anderen Kontext?

Dalai 11. Dez 2018 15:13

AW: z.B. Taskkill erkennen
 
Zitat:

Zitat von sh17 (Beitrag 1420605)
Wie machen es die Prozesse, die man nicht killen kann? Laufen die in einem anderen Kontext?

Auch Prozesse haben unter Windows Berechtigungen. Kann man sich z.B. mit Process Explorer oder Process Hacker anschauen. Derartige Prozesse setzen die Berechtigungen so, dass ein simples Terminieren nicht so einfach geht. Wie das genau geht, weiß ich allerdings auch nicht; interessiert mich allerdings selbst, wie das geht.

Grüße
Dalai

DieDolly 11. Dez 2018 15:16

AW: z.B. Taskkill erkennen
 
Nur eine Vermutung. Aber warum zerbrichst du dir wegen ein paar Nutzern den Kopf? Wenn die dein Programm per TaskManager abschießen und das Risiko korrupter Daten damit eingehen, ist das deren Problem.

sh17 11. Dez 2018 15:31

AW: z.B. Taskkill erkennen
 
Zitat:

Zitat von DieDolly (Beitrag 1420616)
Nur eine Vermutung. Aber warum zerbrichst du dir wegen ein paar Nutzern den Kopf? Wenn die dein Programm per TaskManager abschießen und das Risiko korrupter Daten damit eingehen, ist das deren Problem.

kann man es beweisen? Die sagen, Daten sind kaputt, sie wissen von nichts.

DieDolly 11. Dez 2018 15:42

AW: z.B. Taskkill erkennen
 
Die beste AntiTaskKillMethode bringt doch eh nix. Zieh dem PC den Strom und du hast das gleiche Problem wenn es keine USV gibt.
Das sind Lösungen für Probleme, die man am besten gar nicht erst angehen sollte. Sowas würde ich eher in den Lizenzbedingungen des Programms festhalten und mich absichern.

Schokohase 11. Dez 2018 15:44

AW: z.B. Taskkill erkennen
 
Zitat:

Zitat von sh17 (Beitrag 1420618)
Zitat:

Zitat von DieDolly (Beitrag 1420616)
Nur eine Vermutung. Aber warum zerbrichst du dir wegen ein paar Nutzern den Kopf? Wenn die dein Programm per TaskManager abschießen und das Risiko korrupter Daten damit eingehen, ist das deren Problem.

kann man es beweisen? Die sagen, Daten sind kaputt, sie wissen von nichts.

Bei einer Transaktion sollten die Daten auf keinen Fall kaputt sein. Die sind entweder da oder nicht.

Hobbycoder 11. Dez 2018 17:01

AW: z.B. Taskkill erkennen
 
Mach dir doch einfach einen Thread, der laufend alle laufenden Prozesse auflistet und wenn z.B. Taskmgr (und ggf. noch andere Prozessmanager) dabei ist, dieses logged. Zusätzlich lässt du den Thread selbst per was ins log schreiben. Wenn nun der Taskmanager aufgerufen wurde und dann von deinem Thread kein Logeintrag mehr kam, kannst du davon ausgehen, dass der Prozess abgeschossen wurde.
Ist zwar zusätzlicher Traffic, aber so könnte ich mir vorstellen, könntest du das beweisen.

Bringt natürlich alles nix, wenn, wie Dolly schon sagt, jemand den Strom abschaltet. Es gibt ja so Menschen, die sind so pfiffig und schalten den PC über eine Mehrfachsteckdose mit Schalter aus ;-)

DieDolly 11. Dez 2018 17:04

AW: z.B. Taskkill erkennen
 
Zitat:

Mach dir doch einfach einen Thread, der laufend alle laufenden Prozesse auflistet und wenn z.B. Taskmgr (und ggf. noch andere Prozessmanager) dabei ist, dieses logged. Zusätzlich lässt du den Thread selbst per was ins log schreiben.
Das ist meiner Meinung nach schon unnötige Arbeit. Es gibt nicht nur den Windows TaskManager. Es gibt vermutlich Dutzende. Dann gibt es noch TASKKILL (über cmd) und und und.
Egal was man hier versucht umzusetzen, es ist Zeitverschwendung ... und auch Geldverschwendung.

Luckie 11. Dez 2018 17:16

AW: z.B. Taskkill erkennen
 
Zitat:

Zitat von ADelph (Beitrag 1420604)
Ich hatte mir schon gedacht, dass es nicht einfach geht, bzw. gar nicht gehen könnte...schade, wäre nützlich...

Jupp. Und zwar für Malware. :roll:

Hobbycoder 11. Dez 2018 17:48

AW: z.B. Taskkill erkennen
 
Zitat:

Zitat von DieDolly (Beitrag 1420623)
Zitat:

Mach dir doch einfach einen Thread, der laufend alle laufenden Prozesse auflistet und wenn z.B. Taskmgr (und ggf. noch andere Prozessmanager) dabei ist, dieses logged. Zusätzlich lässt du den Thread selbst per was ins log schreiben.
Das ist meiner Meinung nach schon unnötige Arbeit. Es gibt nicht nur den Windows TaskManager. Es gibt vermutlich Dutzende. Dann gibt es noch TASKKILL (über cmd) und und und.
Egal was man hier versucht umzusetzen, es ist Zeitverschwendung ... und auch Geldverschwendung.

Wenn es darum geht, dass ein Kunde immer das Programm per Taskmanager abschießt und anschließend behauptet er hätte nichts gemacht, dann könnte diese Methode schon helfen. In den aller meisten Fällen beschränkt sich das Wissen der "normalen" Benutzer auf den Taskmanager. Soweit ich das verstanden habe, geht es nicht darum alle Task-/Prozessmanager zu erkenne und zu umgehen.
Und wenn mir ein Kunden Datenverlust unterstellen will, ich aber in der Annahme bin, dass er es selbst verursacht, dann ist das für mich keine Zeit- oder Geldverschwendung. Eher im Gegenteil. Denn wenn ich ihm im Zweifelsfall nachweisen kann, dass er das Problem durch falsche Handhabung selbst verursacht hat, dann könnte ich ihm den Aufwand in Rechnung stellen und nicht er mir den Datenverlust. (Immer mal davon ausgegangen, dass es auch so ist, und TE es so gemeint hat und nicht andere Programmierfehler dafür verantwortlich sind).
Wenn es natürlich aus anderen Gründen "hängt" und der Benutzer gezwungen ist, das Programm abzuschießen, nützt das alles nichts. Und wenn er Taskkill verwendet sowieso nicht, weil das im Gegensatz zum Taskmanager sich sofort wieder beendet, also nur schwer zu erfassen ist. Also gehe ich in meinem Vorschlag lediglich von dem Taskmgr aus.

p80286 11. Dez 2018 19:02

AW: z.B. Taskkill erkennen
 
Zitat:

Zitat von ADelph (Beitrag 1420593)
Moin,

ist es irgendwie möglich, in einem Delphi-Programm den Abbruch durch z.B. taskkill zu erkennen? Mir geht es darum z.B. noch 'hängende' Transaktionen etc. sauber beenden zu können, wenn ein Programm aus anderen Gründen hängen sollte und per z.B. Taskmanager 'abgeschossen' werden soll. Kann ich da irgendeine Message abfangen?

Hinweise sind sehr willkommen ;-)

Wenn mir ein Programm die Möglichkeit bietet es zu beenden (weil es augenscheinlich nichts mehr tut), brauch ich es auch nicht abzuschießen.

Denk mal darüber nach.

Gruß
K-H

Dalai 11. Dez 2018 19:31

AW: z.B. Taskkill erkennen
 
Zitat:

Zitat von Hobbycoder (Beitrag 1420628)
Wenn es darum geht, dass ein Kunde immer das Programm per Taskmanager abschießt und anschließend behauptet er hätte nichts gemacht, dann könnte diese Methode schon helfen.
[...]
Und wenn mir ein Kunden Datenverlust unterstellen will, ich aber in der Annahme bin, dass er es selbst verursacht, dann ist das für mich keine Zeit- oder Geldverschwendung. Eher im Gegenteil.

Wäre es dann nicht besser, zu erkennen, ob ein Programm sauber beendet wurde, so wie es z.B. Windows und Firefox machen? Programm schreibt beim Starten ein Flag irgendwohin (Registry, Datei), dass das Programm NICHT sauber beendet wurde. Beim (sauberen) Beenden des Programms wird das Flag durch ein "wurde sauber beendet" ersetzt. Beim Starten des Programms kann so geprüft werden, ob es zuvor sauber beendet wurde.

Es gibt so viele Varianten, wie man Programme unsauber beenden kann, dass man sich weniger auf diese vielen verschiedenen Methoden konzentrieren sollte, und mehr darauf, ob es sauber beendet wurde.

Unabhängig davon ist die gestellte Frage durchaus interessant. Was nicht notwendigerweise bedeutet, dass die gesuchte Methode geeignet ist, das/die bestehende Problem/Aufgabe zu lösen/erfüllen ;).

Grüße
Dalai

jaenicke 11. Dez 2018 20:10

AW: z.B. Taskkill erkennen
 
Prinzipiell macht es eher Sinn wie z.B. Eclipse auf Multithreading und gut getrennte GUI-Logik zu setzen. Dann kann die Oberfläche kaum hängen bleiben.

Einen Taskkill kann man tatsächlich rein theoretisch verhindern indem man etwas Schindluder mit Sockethandles treibt. Dann verhindert Windows selbst nämlich das Beenden des Tasks. Aus nahe liegenden Gründen möchte ich das hier nicht weiter erörtern auch wenn das Problem seit Windows 8 größtenteils gelöst ist. Für das aktuelle Problem würde es auch nichts bringen, denn man verhindert nicht nur einen Taskkill, sondern man kann das eigene Programm dann leider auch selbst nicht mehr beenden (zumindest habe ich noch keine Möglichkeit gefunden).

Und falls man in der Vergangenheit Probleme mit Hängern hatte, die man nicht finden konnte, kann dort z.B. Eurekalog helfen. Das schreibt nicht nur bei Exceptions Bugreporte, sondern kann das auch machen, wenn das Programm eine einstellbare Zeit nicht mehr reagiert.

Die von Dalai genannten Flags zur Erkennung eines sauberen Herunterfahrens kann man z.B. mit Logs im Systemeventlog kombinieren, wenn so Probleme erkannt wurden.

Redeemer 12. Dez 2018 08:14

AW: z.B. Taskkill erkennen
 
Delphi-Quellcode:
SchreibeLog('Ich tue jetzt was.');
TueWas();
SchreibeLog('Ich tue jetzt nichts mehr.');

Hobbycoder 12. Dez 2018 16:49

AW: z.B. Taskkill erkennen
 
Zitat:

Zitat von Dalai (Beitrag 1420635)
Zitat:

Zitat von Hobbycoder (Beitrag 1420628)
Wenn es darum geht, dass ein Kunde immer das Programm per Taskmanager abschießt und anschließend behauptet er hätte nichts gemacht, dann könnte diese Methode schon helfen.
[...]
Und wenn mir ein Kunden Datenverlust unterstellen will, ich aber in der Annahme bin, dass er es selbst verursacht, dann ist das für mich keine Zeit- oder Geldverschwendung. Eher im Gegenteil.

Wäre es dann nicht besser, zu erkennen, ob ein Programm sauber beendet wurde, so wie es z.B. Windows und Firefox machen? Programm schreibt beim Starten ein Flag irgendwohin (Registry, Datei), dass das Programm NICHT sauber beendet wurde. Beim (sauberen) Beenden des Programms wird das Flag durch ein "wurde sauber beendet" ersetzt. Beim Starten des Programms kann so geprüft werden, ob es zuvor sauber beendet wurde.

Natürlich kann man das auch so machen. Dann weißt du aber immer noch nicht, ob dein Programm "abgeraucht" ist, oder ob der Benutzer es mutwillig mit dem Taskmanager beendet.

Ich gehe mal ganz stark davon aus, das TE eine Möglichkeit zum Beenden eingebaut hat. Also bin ich auf Grund seiner Beiträge davon ausgegangen, dass er einem Benutzer nachweisen will, dass er dort was macht, was er nicht machen soll. Ich könnte mir vorstellen, dass ggf. irgendwo eine längere Routine im Mainthread läuft. Der Benutzer klickt nun auf der Form rum, das Programm reagiert seiner Meinung nach nicht (vielleicht meldet auch Windows "Das Programm reagiert nicht") und schon wird, je nach User, schnell der Taskmanager gezückt.
Vielleicht will der TE im ja genau dieses Verhalten nachweisen.

Was aber genau, das weiß nur der TE persönlich.

Dalai 12. Dez 2018 19:31

AW: z.B. Taskkill erkennen
 
Zitat:

Zitat von Hobbycoder (Beitrag 1420688)
Natürlich kann man das auch so machen. Dann weißt du aber immer noch nicht, ob dein Programm "abgeraucht" ist, oder ob der Benutzer es mutwillig mit dem Taskmanager beendet.

Das stimmt zwar, widerlegt aber in beiden Fällen die Behauptung des Nutzers, er hätte nichts gemacht. Auch ein instabiles System (und dadurch abstürzende Software) liegt im Einflussbereich des Nutzers - und sei es nur, den Admin dazu zu bringen, das Problem zu untersuchen und abzustellen.

Grüße
Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 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