Come eseguire il mio programma prima di disconnettersi su Windows XP?
-
11-07-2019 - |
Domanda
Sto cercando una versione inversa di " RunOnceEx " ;.
RunOnceEx esegue alcuni programmi, prima dell'avvio della shell dell'utente (desktop e barra delle applicazioni). L'avanzamento dell'accesso non continuerà prima del completamento di runonceex.
Voglio fare esattamente lo stesso ma al logout dell'utente. Quando lei / lui si disconnette, tutti i programmi in esecuzione si arrestano, lasciando la shell (desktop & barra delle applicazioni), quindi "quot". Vorrei che il mio programma verrà eseguito in questo momento "quot", infine disconnettersi.
Penso che sia possibile perché il " mobsync.exe " lo sta facendo. Ma non riesco a trovare dove e come farlo.
Soluzione
Per eseguirlo solo per l'utente corrente, è possibile utilizzare WMI per ottenere informazioni in caso di arresto / disconnessione.
O scrivi un piccolo C # (o qualsiasi altra lingua che può usare WMI) o script vbs per ascoltare l'evento Win32_ComputerShutdownEvent WMI.
Un'app C # di esempio è disponibile qui in questa domanda: Ottieni l'evento di disconnessione da sistema
Altri suggerimenti
Avviso, come detto qui , gpedit.msc
ti permetterà di configurare uno script di disconnessione per tutti utenti .
Se hai bisogno di quello script solo per un utente, devi dichiararlo direttamente nel registro, sia in HKCU
che HKLM
.
trovato nel primo risultato su Google per me
Per eseguire un programma è possibile creare uno script per eseguirlo e utilizzare i criteri di gruppo per applicarlo. Nell'editor Criteri di gruppo vai a Configurazione utente - > Impostazioni di Windows - > Scripts (Logon / Logoff)
Se si desidera che un programma in esecuzione esegua il codice alla disconnessione, è necessario agganciare il messaggio WM_QUERYENDSESSION
e cercare un valore lParam
di ENDSESSION_LOGOFF
(0x80000000).
È importante verificare questo valore lParam
perché gli altri indicano una chiusura forzata " - vale a dire che il processo potrebbe essere interrotto prima ancora che l'esecuzione del codice venga autorizzata. In effetti, la maggior parte dei messaggi di arresto / fine sessione hanno solo lo scopo di darti l'opportunità di eseguire il codice di pulizia dell'ultimo minuto e non sono così sicuri di rispondere con azioni a lungo termine; ma questa particolare combinazione dovrebbe essere OK.
Nota: non ho mai provato a eseguire effettivamente un processo separato in risposta al messaggio WM_QUERYENDSESSION
. È possibile che il gestore delle finestre lo impedisca, come avviene durante l'arresto. Provalo e vedi, suppongo.
Se ti trovi in ??un ambiente .NET (non specificato), un modo più rapido è aggiungere un gestore eventi all'evento Microsoft.Win32.SystemEvents.SessionEnding
.
Ciò di cui hai bisogno è un'implementazione di GINA . Puoi eseguire i tuoi comandi personalizzati in WlxIsLogoffOk funzione, che viene chiamata quando l'utente avvia una disconnessione
Una volta creata la DLL GINA corretta, è possibile registrarla qui: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ @GinaDLL
Ecco un'implementazione che può soddisfare le tue esigenze (fornisce una chiave di registro di Logoff dove puoi specificare il tuo comando): http://wwwthep.physik.uni-mainz.de/~ Frink / newgina_pre09 / readme.html
Come già menzionato VonC e TFD, l'Editor criteri di gruppo è solo un altro modo per manipolare il registro.
Apporta con gpedit le modifiche (in Userconfig - Impostazioni di Windows - Script) che ti piacciono e successivamente dai un'occhiata al registro in [HKEY_CURRENT_USER \ Software \ Policies \ Microsoft \ Windows \ System \ Scripts]
per scoprire come puoi farlo direttamente.
Anche sul mio PC (sospeso in un dominio) è presente una cartella nascosta C: \ WINDOWS \ System32 \ GroupPolicy
con sottocartelle per utente e macchina. Entrambi con sottocartelle aggiuntive denominate Shutdown e Startup. Forse puoi anche usare questi.
Se hai bisogno di qualcosa di semplice e funzionante per un singolo (o qualsiasi) utente, puoi creare una semplice applicazione in C ++ o C # per esempio.
Il più semplice è avere un C # nel vassoio (semplicemente aggiungendo il componente del vassoio al modulo) e registrarsi e il gestore dell'evento per l'evento FormClosing . Sembrerebbe così:
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();
}
}
Quindi l'applicazione verrà avviata con Windows o con l'utente. Aspetterà (usando un po 'di memoria) e farà qualcosa quando il sistema si spegne, o l'utente si disconnette, ecc. (Controllando " CloseReason " sopra).