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/)
-   -   Delphi Vista PC mit NT-Service herunterfahren / Benutzer ausloggen (https://www.delphipraxis.net/138740-vista-pc-mit-nt-service-herunterfahren-benutzer-ausloggen.html)

kuba 16. Aug 2009 20:47


Vista PC mit NT-Service herunterfahren / Benutzer ausloggen
 
Hallo,

hat jemand eine Ahnung wie man aus einem NT-Service heraus Windows Vista herunterfahren kann ?

Ich habe InitiateSystemShutdown versucht, aber Windows Vista macht nichts.

Mein Code:

Delphi-Quellcode:
    InitiateSystemShutdown('',     // shut down localhost
    'Benutzer werden ausgeloggt !', // message to user
    10,                            // time-out
    TRUE,                          // ask user to close apps
    FALSE);                        // reboot after shutdown

Benötigt der Systemdienst bestimmte Privilegien um den Vista PC herunterzufahren ?

KUBA

MagicAndre1981 16. Aug 2009 21:47

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
Zitat:

To shut down the local computer, the calling thread must have the SE_SHUTDOWN_NAME privilege
steht doch ganz unten auf der verlinkten Seite.

kuba 16. Aug 2009 22:04

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
ja, stimmt. Herunterfahren geht auch, aber die Benutzerabmeldung funktioniert nicht im NT-Service.

Hier mein Code:

Delphi-Quellcode:

function MyExitWindows(RebootParam: Longword): Boolean;
var
  TTokenHd: THandle;
  TTokenPvg: TTokenPrivileges;
  cbtpPrevious: DWORD;
  rTTokenPvg: TTokenPrivileges;
  pcbtpPreviousRequired: DWORD;
  tpResult: Boolean;
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    tpResult := OpenProcessToken(GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
      TTokenHd);
    if tpResult then
    begin
      tpResult := LookupPrivilegeValue(nil,
                                       SE_SHUTDOWN_NAME,
                                       TTokenPvg.Privileges[0].Luid);
      TTokenPvg.PrivilegeCount := 1;
      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      cbtpPrevious := SizeOf(rTTokenPvg);
      pcbtpPreviousRequired := 0;
      if tpResult then
        Windows.AdjustTokenPrivileges(TTokenHd,
                                      False,
                                      TTokenPvg,
                                      cbtpPrevious,
                                      rTTokenPvg,
                                      pcbtpPreviousRequired);
    end;
  end;
  Result := ExitWindowsEx(RebootParam, 0);
end;

procedure TWDay.Button2Click(Sender: TObject);
begin
    MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;

Warum funktioniert das Abmelden des Benutzers mit dem NT-Service nicht ?

KUBA

ringli 16. Aug 2009 22:17

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
Welche Funktion benutzt du denn nun? MyExitWindows oder doch InitiateSystemShutdown? :gruebel:

kuba 16. Aug 2009 22:39

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
Zitat:

Zitat von ringli
Welche Funktion benutzt du denn nun? MyExitWindows oder doch InitiateSystemShutdown? :gruebel:

Die erste funktioniert gar nicht (hab ich auch geschrieben). Die zweite fährt den PC herunter, es funktioniert jedoch nicht mit dem Benutzer ausloggen.

kuba

ringli 17. Aug 2009 08:07

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
Zitat:

Zitat von kuba
Die erste funktioniert gar nicht (hab ich auch geschrieben). Die zweite fährt den PC herunter, es funktioniert jedoch nicht mit dem Benutzer ausloggen.

Hast du denn mal MagicAndre's Hinweis beachtet? Ich hatte mir auf die Schnelle ein VCL-Testprojekt mit InitiateSystemShutdown geschrieben das erst auch nicht funktionierte. Nachdem ich das SE_SHUTDOWN_NAME-Privileg aktiviert habe, funktionierte es. Ob sich die Funktion allerdings aus einem Dienst heraus aufrufen lässt habe ich nicht probiert da ich bisher noch keinen Dienst programmiert habe.

Luckie 17. Aug 2009 08:47

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
Hast du denn schon mal den Rückgabeparameter ausgewertet und mal geguckt, was das System für einen letzten Fehler meldet, wenn du InitiateSystemShutdown verwendest?

kuba 17. Aug 2009 09:00

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
Hallo Luckie,

leider kenne ich mich noch nicht so gut aus, wie kann ich die Rückgabeparameter auswerten ?

Bei mir funktioniert das meiste per try and error, so habe ich Routine 2 mit EWX_SHUTDOWN versucht.
Das funktioniert bei einem normalen Benutzer (wird abgemeldet), beim NT-Service fährt der PC jedoch runter und schaltet ab.

kuba

DeddyH 17. Aug 2009 09:04

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
Zitat:

If the function fails, the return value is zero. To get extended error information, call GetLastError.

kuba 17. Aug 2009 09:10

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
Da der PC herunterfährt müsste ich das Ergebnis irgendwo ablegen, z.B. in der Registry oder einem File ?

Kann mir jemand kurz erläutern (am besten mit einem kleinen Beispiel) wie ich den Rückgabewert herausfinde ?

kuba

kuba 17. Aug 2009 16:34

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
Zitat:

Zitat von ringli
Zitat:

Zitat von kuba
Die erste funktioniert gar nicht (hab ich auch geschrieben). Die zweite fährt den PC herunter, es funktioniert jedoch nicht mit dem Benutzer ausloggen.

Hast du denn mal MagicAndre's Hinweis beachtet? Ich hatte mir auf die Schnelle ein VCL-Testprojekt mit InitiateSystemShutdown geschrieben das erst auch nicht funktionierte. Nachdem ich das SE_SHUTDOWN_NAME-Privileg aktiviert habe, funktionierte es. Ob sich die Funktion allerdings aus einem Dienst heraus aufrufen lässt habe ich nicht probiert da ich bisher noch keinen Dienst programmiert habe.


Routine 2 eledigt das mit SE_SHUTDOWN_NAME Privileg, es wird im NT-Dienst auch benötigt sonst passiert nichts. Aber das Ausloggen will mir nicht gelingen, der PC schaltet sich ab statt die Benutzer auszuloggen.

Meine Vermutung geht dahin, dass ich dem System irgendwie mitteilen muss welcher Benutzer ausgeloggt werden soll - Da der Benutzer auf Vista Console "1" arbeitet und der NT-Service immer auf Vista Console 0 vermute ich dass der Systemdienst "sich abmeldet" und nicht den Benutzer.

Es wäre für mich sehr hilfreich, wenn mir jemand erläutern könnte wie ich im NT-Service GetLastError abfragen kann.

Ansonsten ... try and error :mrgreen:

kuba

Der.Kaktus 17. Aug 2009 16:46

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
Zitat:

Zitat von kuba
Hallo,

hat jemand eine Ahnung wie man aus einem NT-Service heraus Windows Vista herunterfahren kann ?

Ich habe InitiateSystemShutdown versucht, aber Windows Vista macht nichts.

Mein Code:

Delphi-Quellcode:
    InitiateSystemShutdown('',     // shut down localhost
    'Benutzer werden ausgeloggt !', // message to user
    10,                            // time-out
    TRUE,                          // ask user to close apps
    FALSE);                        // reboot after shutdown

Benötigt der Systemdienst bestimmte Privilegien um den Vista PC herunterzufahren ?

KUBA

Hallo, schau Dir mal den Beitrag in der :dp: an Windows-Shutdown
und speziell im letzten Thread von toms den Link ;-) :glaskugel:

kuba 17. Aug 2009 17:17

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
@Der Kaktus

Den hab ich mir schon paar mal durchgelesen, hat mich jedoch nicht zum Ziel gebracht. Kein LogOff - immer PowerOff (bei Vista). Aber nochmal zu meiner o.g. Vermutung. Ich hab in meinem NT-Service einfach mal shutdown.exe /l /f gestartet, dabei habe ich ProgramExecute verwendet.

Vielleicht habe ich mich oben etwas unklar ausgedrückt, ich meine jedenfalls dass der LogOff bei Vista mit "Benutzerrechten" initiiert werden muss und nicht mit "Systemrechten" ausgeführt werden darf, von 'WinSta0' im NT-Service.

Und siehe da, es funktioniert :bounce2:

Jetzt muss ich die Routine noch passend umstricken und dann solls wohl gehen ...

kuba

PS: ich würd auch abschalten wenn sich ein NT-Service "abmeldet" tschüüss...

Der.Kaktus 17. Aug 2009 18:09

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
Zitat:

Zitat von kuba
@Der Kaktus

Den hab ich mir schon paar mal durchgelesen, hat mich jedoch nicht zum Ziel gebracht. Kein LogOff - immer PowerOff (bei Vista). Aber nochmal zu meiner o.g. Vermutung. Ich hab in meinem NT-Service einfach mal shutdown.exe /l /f gestartet, dabei habe ich ProgramExecute verwendet.

Vielleicht habe ich mich oben etwas unklar ausgedrückt, ich meine jedenfalls dass der LogOff bei Vista mit "Benutzerrechten" initiiert werden muss und nicht mit "Systemrechten" ausgeführt werden darf, von 'WinSta0' im NT-Service.

Und siehe da, es funktioniert :bounce2:

Jetzt muss ich die Routine noch passend umstricken und dann solls wohl gehen ...

kuba

PS: ich würd auch abschalten wenn sich ein NT-Service "abmeldet" tschüüss...

Na Hauptsache..es funzt ;-)

kuba 17. Aug 2009 23:58

Re: Vista PC mit NT-Service herunterfahren / Benutzer auslog
 
Zitat:

Zitat von Der.Kaktus

Na Hauptsache..es funzt ;-)

genau !! mit LockWorkstation besteht bei Vista mit NT-Service übrigens das gleiche Problem.
Ich teste jedenfalls alles durch damit mein Programm "richtig" funzt :zwinker:

kuba


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr.

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