Problem nach Logoff mit ExitWindowsEx



  • Hallo,

    bin neu hier und habe nun schon 2 Stunden gegoogelt ohne Erfolg. Ich hoffe es kann mir jemand helfen.

    Ich schreibe gerade mit Borland C++ 5 ein Programm, daß durch einen Registry-Eintrag in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
    gestartet wird, d.h. es soll laufen, bevor alle anderen Programme und Prozesse anlaufen. Das Programm verlangt ein Passwort. Wenn das Programm beendet wird bevor der Benutzer das Passwort eingegeben hat soll der Benutzer abgemeldet werden.
    Das Abmelden habe ich mit ExitWindowsEx realisiert, für Windows 9x vorher den Explorer-Prozeß beendet und auch die Privilegien geändert, um auf Nummer sicher zu gehen. 🕶
    Wenn das Programm nun, angestoßen durch das Ereignis von onDestroy, ExitWindowsEx ausführt, so wird der Benutzer abgemeldet und man landet in der Benutzerauswahl.
    Soweit so gut, jetzt kommt das Problem:

    ⚠ Man kann nun (bei Windows XP Home SP2) nicht mehr das Passwort eingeben. 😞 Das Passworteingabefeld erscheint aber der Textcursor wird nicht gesetzt. Woran liegt das? Welche andere Möglichkeit habe ich den Benutzer abzumelden, bevor der Systemstart fortgesetzt wird?

    Ich hoffe jemand hat eine Idee, ich bin jedenfall recht ratlos! 😕
    Danke schon mal für eure Zeit und Hilfe.

    MfG

    Darkwind



  • Damit hab ich nicht befasst, aber ein Versuch: Beendet sich dein Programm direkt nach dem Aufruf von ExitWindowsEx? Weil wenn nein empfängt es vielleicht noch die Benutzereingaben... Oder sonst evtl mit SetFocus( GetForegroundWindow() ) oder so den Focus an ein anderes "Fenster" weiterleiten?
    Andererseits müsste das Textfeld ja den Focus haben... Verzwickt...

    Achso, ne, das Eingabefeld erhält ja anscheinend nicht den Focus, daran wirds wohl liegen. Mal probiert ob du was mit EnumWindows rauskriegst? K.A. wie man da ne Ausgabe machen kann (Datei?), aber das Edit-Feld (falls es eins ist) muss ja den Focus bekommen...



  • Hallo Badestrand,

    danke für deine schnelle Antwort. 🙂 Es wird wohl so sein, daß das System noch Benutzereingaben empfängt, denn das System meldet den Benutzer, da ExitWindowsEx ja asynchron läuft, erst etwa 1 bis 1,5 Sekunden nach dem Schließen des Programmfensters ab. In dieser Zeit baut sich der Desktop auf und andere Programme und Prozesse starten.
    Auf Grund dieser Asynchronität ist das auch ein verflixt tückischer Fehler, denn von etwa 3 Versuchen ist immer einer dabei wo alles normal läuft, d.h. das Passwort-Eingabefeld für den Benutzer erhält den Focus. Sonst gibt es zum Glück noch den "Affengriff" (Strg+Alt+Entf), um sich mit dem alten Anmeldeverfahren im Win2k-Fenster-Style einzuloggen.
    Vielleicht ist der Start im HKLM>...>RunOnce für dieses Programm nicht so klug. Kennt jemand eine Alternative? 😕 Mir schwebt so etwas vor wie das Aktivierungsfenster von MS WinXP, das ebenfalls direkt nach dem Einloggen kommt und den Benutzer auch abmeldet, wenn er sich nicht aktivieren kann. :p Weiß einer wie das dann gestartet wird?

    Gehe jetzt erstmal schlafen. :xmas1: Grüble morgen weiter.
    Danke
    MfG

    Darkwind



  • Zwischenstandsmeldung:

    Habe das Abmelden jetzt so programmiert, daß es so aussieht.

    ExitWindowsEx(EWX_LOGOFF,NULL);
      MessageBox(NULL,"Benutzer wird abgemeldet.","Warnung",MB_OK);
    

    Der Vorteil ist, daß andere Prozesse nicht mehr angestoßen werden können, da HKLM>...>RunOnce die Eigenschaft hat Prozesse nur einzeln laufen zu lassen und MessageBox auf eine Benutzereingabe wartet, so dass das Programm also nicht beendet wird. Somit wäre das Problem der Asynchronität von ExitWindowsEx erledigt. 🙂
    Was bleibt ist das Problem mit der XP-Benutzer-Anmeldung im XP-Style. 😞 Eine Not-Lösung wäre natürlich in der Registry das Flag für die Art der Anmeldung in der Registry auf die klassische Anmeldung zu setzen. Also
    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system]
    LogonType = 0
    Aber das will ich eigentlich nicht. 😞
    Wenn man das Programm den Benutzer nach abgeschlossenem Systemstart abmelden läßt, funktioniert alles problemlos.
    Imho muß es ein Problem mit der Startreihenfolge der Prozesse von XP sein. Irgendein Prozeß muß noch angestoßen werden bevor mein Programm den Benutzer abmelden kann. Wenn das stimmt, welcher?
    Ich werde mal mit enumWindows schauen was noch so läuft, aber die Implementierung der Ausgabe wird wohl was dauern.
    Ich melde mich wieder.
    MfG

    Darkwind



  • So, habe ein bisschen an dem Problem rumgebastelt und getestet. Es läuft jetzt, aber optimal ist das wahrscheinlich nicht. 🙄

    ShellExecute(NULL, NULL, "explorer.exe", NULL, NULL, SW_SHOWMINNOACTIVE);
      ExitWindows(EWX_LOGOFF,NULL);
    //  MessageBox(NULL,"Benutzer wird abgemeldet.","Warnung",MB_OK);
      exit(EXIT_SUCCESS);
    

    Die Sache ist die, dass wenn der explorer-Prozeß vorm Abmelden gestartet wird das Edit-Feld in der Benutzer-Anmeldung wieder einen Focus hat. Na ja, zumindest in 95% der Fälle. Das soll mir reichen. Die Rest-5% kommen halt in die Anleitung, daß man notfalls auch die klassische Anmeldung wählen kann. 😃
    Wie sinnvoll ein exit() in einer onDestroy()-Methode des Hauptfensters ist sei mal dahingestellt. 🕶
    Danke an den verbrauchten Gehirnschmalz.

    MfG

    Darkwind


Log in to reply