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.

È stato utile?

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)

maggiori informazioni qui

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top