Problem mit Benutzerrechten zum Herunterfahren von Windows beim Loginscreen.



  • Moin,

    mein erster (bisher erzwungener) Ausflug von Java zu C++ lief mit der Erstellung eines Bildschirmschoners ganz gut - Nur leider macht er nicht das, was er soll. Nach 600 Sekunden soll der Computer heruntergefahren werden und automatisch alle Anwendungen schließen. Mittels der shutdown.exe klappte das hier am Testrechner auch ganz gut, sobald der Bildschirmschoner allerdings im Login-Screen läuft(wo er auch laufen soll), passiert garnichts.

    Also bin ich umgestiegen auf die Windows APi.

    Wenn ich eingeloggt bin als Administrator, funktioniert alles einwandfrei.
    Als anderer User klappt es warscheinlich auch, habe ich noch nicht probiert.
    Beim Loginscreen läuft der Countdown (mit dem gleichen Programm) allerdings einfach durch und nichts passiert. Ich dachte, das ganze lässt sich dadurch lösen, dass ich bei Lokale Sicherheitsrichtlinien der Gruppe Benutzer + dem User SYSTEM (für den Loginscreen) die Rechte zum erzwungenen Herunterfahren + Herunterfahren gebe, aber dem war leider nicht so.

    HANDLE hToken;
                  TOKEN_PRIVILEGES tkp;
    
                  // Get a token for this process.
                  OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
                     // Get the LUID for the shutdown privilege.
                  LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
                  tkp.PrivilegeCount = 1;  // one privilege to set    
                  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
                  // Get the shutdown privilege for this process.
                  AdjustTokenPrivileges( hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0 );
                  if( GetLastError() != ERROR_SUCCESS )
                  MessageBox(NULL, "AdjustTokenPrivileges enable failed.", "Fehler", NULL);
                     // Shut down the system and force all applications to close.
                   if(!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0x00020000 | 0x00000003 | 0x80000000))
                   MessageBox(NULL, "Fehler beim Herunterfahren.", "Fehler", NULL);
                  countdown =0;
    

    Das ist der Code. Im Prinzip 1:1 von der MSDN übernommen. Die MAJOR SHUTDOWN_REASON usw hab ich direkt durch binäre Zahlen ersetzt, das kanns aber auch nicht sein. Die Messageboxen hab ich eben eingefügt und weiss nicht ganz, wie sie funktionieren. Aber das ist erstmal nebensächlich.

    Wie würdet ihr das Problem lösen?



  • Hi,

    hat das ganze nicht vielleicht damit zu tun, dass man vor dem Login keine "normalen" Programme starten darf, da man sonst anderen Leuten einen Keyboard-Logger unterschleusen könnte um deren Passwort heraus zu finden? Afaik darf/kann nur ein Service vor dem Login gestartet werden.

    Ist aber auch nur eine Vermutung meinerseits und blindes rumgestocher 😉



  • jein - der windows bildschirmschoner oder explorer.exe wird ja auch gestartet, wenn ich es da eintrage.


Anmelden zum Antworten