Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Konsolenprogramm und Shutdown verhindern (https://www.delphipraxis.net/117926-konsolenprogramm-und-shutdown-verhindern.html)

xpmd 28. Jul 2008 14:54


Konsolenprogramm und Shutdown verhindern
 
Hi,

ich habe folgendes Szenario: Ich habe einen Dienst der normal unter SYSTEM-Account läuft. Auf diesen Dienst habe ich Codetechnisch keinen Zugriff. Dieser Dienst startet allerdings eine von mir geschriebene Konsolenanwendung. Nun muss diese Konsolenanwendung die Fähigkeit haben, wärend sie läuft, den Shutdown zu verhindern.

Da ich ja kein Fenster habe, und die Konsolenanwendung auch vom Dienst unter SYSTEM gestartet wird, kann ich die Lösung über WM_QueryEndSession vergessen.

Bleibt mir quasi noch die SetConsoleCtrlHandler und dort CTRL_SHUTDOWN_EVENT abfangen. Klappt soweit gut, Nur weiß ich jetzt nicht wie ich innerhalb dieses Events den Shutdown tatsächlich verhindern kann, so wie es über WMQueryEndSession gehen würde. Weiß jemand eine Lösung?

Grüße,
xpmd

new32 28. Jul 2008 15:23

Re: Konsolenprogramm und Shutdown verhindern
 
Unter nt4-xp:

mit NtSetInformationProcess (und NtCreateToken) allen Prozessen das SeShutdownPrivilege entziehen.

Achtung: Die Funktion ist nicht von ms dokumentiert und funktioniert nicht mehr unter vista!


Und noch ne Lösung [einfacher und besser]:

Mit SuspendThread alle Threads von winlogon auf eis legen. dann dürfte das system erst runterfahren, wenn winlogon wieder mit ResumeThread aufgetaut wird.

Muetze1 28. Jul 2008 15:43

Re: Konsolenprogramm und Shutdown verhindern
 
Moin!

Es gibt aber gute Literatur dazu: http://www.amazon.de/exec/obidos/ASIN/1578701996/delphipraxis-21

MfG
Muetze1

new32 28. Jul 2008 15:55

Re: Konsolenprogramm und Shutdown verhindern
 
Ein sehr gutes Buch!
Aber wie der Titel schon sagt nt/2k!

Unter vista lässt sich das AccessToken nicht mehr ändern wenn der Prozess läuft (wie ich letztens erfahren musste).

Von daher ist es besser Winlogon einzufrieren.

Luckie 28. Jul 2008 22:07

Re: Konsolenprogramm und Shutdown verhindern
 
Zitat:

Zitat von new32
mit NtSetInformationProcess (und NtCreateToken) allen Prozessen das SeShutdownPrivilege entziehen.

Warum schon wieder eine undokumentierte API-Funktion? Einfach beim Abfangen der Nachricht den entsprechenden Wert zurück geben. Allerdings kann man unter Vista das Runterfahren nicht mehr so einfach verhindern.

Warum darf der Rechner denn nicht runtergefahren werden, wenn dein Programm läuft?

Zacherl 28. Jul 2008 23:09

Re: Konsolenprogramm und Shutdown verhindern
 
Die Lösung über WM_QUERYENDSESSION geht doch nicht, weil er einen Service verwendet.

Mach doch einen Hook auf ExitWindowsEx.

Apollonius 28. Jul 2008 23:13

Re: Konsolenprogramm und Shutdown verhindern
 
Was spricht gegen einen zusätzlichen Thread mit einem Fenster, über das man die Nachricht erhält?

new32 29. Jul 2008 10:07

Re: Konsolenprogramm und Shutdown verhindern
 
Zitat:

Zitat von Luckie
Warum schon wieder eine undokumentierte API-Funktion?

Sorry mir is in dem Moment keine andere Lösung eingefallen.
Aber ich hab ja auch davon noch abgeraten; ich wollte es nur nicht komplett löschen, weil es ja auch ne Lösung ist.

Aber was spricht gegen die Methode mit winlogon?

new32 29. Jul 2008 10:08

Re: Konsolenprogramm und Shutdown verhindern
 
2x auf absenden gedrückt sorry. Ich dachte der Browser würde hängen

xpmd 29. Jul 2008 11:00

Re: Konsolenprogramm und Shutdown verhindern
 
Zitat:

Zitat von new32
Zitat:

Zitat von Luckie
Warum schon wieder eine undokumentierte API-Funktion?

Sorry mir is in dem Moment keine andere Lösung eingefallen.
Aber ich hab ja auch davon noch abgeraten; ich wollte es nur nicht komplett löschen, weil es ja auch ne Lösung ist.

Aber was spricht gegen die Methode mit winlogon?

Hmm alle Winlogon-Threads schlafen lassen? Ist das nicht etwas brachial? Der PC sollte in der Zeit eigentlich ganz normal weiter arbeiten können. Im Hintergrund läuft währenddessen eine Software-Installation.


Zitat:

Zitat von new32
Unter nt4-xp:

mit NtSetInformationProcess (und NtCreateToken) allen Prozessen das SeShutdownPrivilege entziehen.

Achtung: Die Funktion ist nicht von ms dokumentiert und funktioniert nicht mehr unter vista!


Und noch ne Lösung [einfacher und besser]:

Mit SuspendThread alle Threads von winlogon auf eis legen. dann dürfte das system erst runterfahren, wenn winlogon wieder mit ResumeThread aufgetaut wird.

Wär für XP ne Lösu8ng. Undokumentierte API-Funktionen will ich aber eigentlich vermeiden. Für Vista gibts ja die neue Shutdown-API. Mit der könnt ich mir schon ne Lösung vorstellen. Aber Vista hat auch eine undokumentierte CancelShutdown Funktion :-)




Zitat:

Zitat von Zacherl
Die Lösung über WM_QUERYENDSESSION geht doch nicht, weil er einen Service verwendet.

Mach doch einen Hook auf ExitWindowsEx.

Hab mich noch überhaupt nicht mit Hooks beschäftigt. Wär evtl ne Lösung aber wie gesagt noch ein absolut unberührtes Thema für mich.


Zitat:

Zitat von Apollonius
Was spricht gegen einen zusätzlichen Thread mit einem Fenster, über das man die Nachricht erhält?

Hatte ich schon probiert. Komischerweise erhielt das Fenster keine Message. Lags evtl daran dass das Konsolenprogramm eben von einem Dienst unter SYSTEM gestartet wurde, und das Fenster unsichtbar ist.? Oder hab ich da was im Code verpeilt, werds mir nochmal anschaun.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:38 Uhr.
Seite 1 von 2  1 2      

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