Wie mein Programm auf, bevor logout auf Windows XP laufen zu lassen?
-
11-07-2019 - |
Frage
Ich bin für eine inverse Version von "RunOnceEx".
RunOnceEx nicht irgendein Programm laufen, bevor die Shell des Benutzers (Desktop und die Taskleiste) starten. Der Fortschritt Login wird nicht fortgesetzt, bevor die RunOnceEx abgeschlossen.
Ich will genau das gleiche, aber auf die Abmeldung eines Benutzers tun. Wenn sie / er abzumelden, alle Programmherunterfahren laufen, so dass Shell (Desktop und die Taskleiste), dann „“ Ich habe mein Programm wünschen wird diesen Moment ausführen „“, schließlich Logout.
Ich denke, es ist möglich, weil die „mobsync.exe“ das tut. Aber ich kann nicht finden, wo und wie es zu tun.
Lösung
dies für den aktuellen Benutzer nur ausführen kann, können Sie WMI verwenden, um eine Information zu erhalten, wenn ein shutdown / Abmeldung erfolgt.
Entweder Sie schreiben ein kleines C # (oder irgendeine andere Sprache, die WMI verwenden können) Anwendung oder vbs-Skript auf das hören Win32_ComputerShutdownEvent WMI-Ereignis.
Ein Beispiel C # App kann hier in dieser Frage zu finden: Get Abmelden Ereignis aus System
Andere Tipps
Warnung, wie gesagt hier , gpedit.msc
ermöglicht es Ihnen, ein Abmeldeskript für alle Nutzer zu konfigurieren.
Wenn Sie das Skript müssen nur für einen Benutzer, müssen Sie es direkt in der Registrierung erklären, die beide in HKCU
und HKLM
.
in der ersten Folge auf Google für mich gefunden
Um ein Programm ausführen Sie ein Skript erstellen können, um sie auszuführen und Gruppenrichtlinien zu verwenden, um es zu erzwingen. In Gruppenrichtlinien-Editor auf Benutzerkonfiguration navigieren -> Windows-Einstellungen -> Skripts (Anmelden / Abmelden)
Wenn Sie ein laufendes Programm wollen Code auf Abmelde auszuführen, dann sollten Sie die WM_QUERYENDSESSION
Nachricht Haken und suchen Sie nach einem lParam
Wert von ENDSESSION_LOGOFF
(0x80000000).
Es ist wichtig, für diesen lParam
Wert zu testen, da die anderen eine „erzwungene Nähe“ zeigen - das heißt Ihr Prozess getötet werden, bevor Sie den Code selbst ausführen darf. In der Tat sind die meisten shutdown / session-End-Nachrichten nur sollen Ihnen die Möglichkeit geben, Last-Minute-Bereinigungscode zu laufen und sind nicht so sicher mit langer Laufzeit Aktionen zu reagieren; aber diese spezielle Kombination sollte in Ordnung sein.
Hinweis: Ich habe nie versucht, einen separaten Prozess in Reaktion auf die WM_QUERYENDSESSION
Nachricht tatsächlich auszuführen. Es ist möglich, dass der Window-Manager dies nicht zulassen wird, wie es bei dem Herunterfahren der Fall ist. Probieren Sie es aus und sehen, glaube ich.
Wenn Sie in einer .NET-Umgebung sind (Sie hat nicht angegeben), ein schneller Weg ist, ein Event-Handler zum Microsoft.Win32.SystemEvents.SessionEnding
Ereignis hinzuzufügen.
Was Sie brauchen, ist eine Implementierung von GINA . Sie können Ihre benutzerdefinierten Befehle in WlxIsLogoffOk laufen Funktion, die, wenn der Benutzer eine Abmelde aufgerufen wird, startet
Wenn Sie die richtige GINA erstellen dll Sie es hier registrieren: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\@GinaDLL
Hier ist eine Implementierung, die Ihren Anforderungen entsprechen können (es bietet eine Abmelderegistrierungsschlüssel, wo Sie Ihren Befehl angeben können): http://wwwthep.physik.uni-mainz.de/~ Frink / newgina_pre09 / readme.html
Wie VonC und TFD bereits erwähnt, ist die Gruppenrichtlinien-Editor nur ein weiterer Weg, um die Registrierung zu bearbeiten.
machen Just mit gpedit die Änderungen (in UserConfig - Windows-Einstellungen - Scripts) Sie mögen und danach einen Blick in die Registrierung bei [HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts]
nehmen
um herauszufinden, wie man direkt das tun kann.
Auch auf meinem PC (in einer Domäne hängend) ist ein versteckter Ordner C:\WINDOWS\System32\GroupPolicy
mit Unterordner für Benutzer und Maschine. Beide haben weitere Unterordner Shutdown und Startup aufgerufen. Vielleicht können Sie auch diese hier verwenden.
Wenn Sie etwas einfach und arbeiten für einen einzelnen (oder überhaupt) Benutzer benötigen, können Sie eine einfache Anwendung in C ++ machen oder C # zum Beispiel.
Die einfachste eines C # in Schale wird mit (durch einfaches Hinzufügen der Tablett-Komponente auf die Form) und registriert und Ereignishandler für das Formclosing Ereignis. Es würde wie folgt aussehen:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason != CloseReason.UserClosing)
{
// It's not the user closing the application,
// Let's do whatever you want here, for example starting a process
Process notePad = new Process();
notePad.StartInfo.FileName = "notepad.exe";
notePad.StartInfo.Arguments = "ProcessStart.cs";
notePad.Start();
}
}
So Ihre Anwendung unter Windows oder mit dem Benutzer gestartet werden. Es würde warten (ein wenig Speicher verwendet wird) und wird etwas tun, wenn das System heruntergefahren oder der Benutzer abmelden, usw. (durch „CloseReason“ oben-Kontrolle).