Question

Je recherche une version inverse de "RunOnceEx".

RunOnceEx exécute certains programmes avant que le shell de l'utilisateur (bureau et barre des tâches) ne démarre. La progression de la connexion ne se poursuivra pas avant la fin de l'exécution du runonceex.

Je veux faire exactement la même chose mais à la déconnexion de l'utilisateur. Lorsqu’elle se déconnecte, tout le programme est en cours d’exécution, quitte shell et le shell (bureau & barre des tâches), puis "" Je souhaite que mon programme soit exécuté à ce moment", puis se déconnecte.

Je pense que cela est possible car le fichier "mobsync.exe" fait cela. Mais je ne trouve pas où et comment le faire.

Était-ce utile?

La solution

Pour l'exécuter uniquement pour l'utilisateur actuel, vous pouvez utiliser WMI pour obtenir des informations en cas d'arrêt / de déconnexion.

Vous écrivez soit une petite application C # (ou tout autre langage pouvant utiliser WMI), soit un script vbs à écouter sur l'événement WMI Win32_ComputerShutdownEvent .

Vous trouverez un exemple d'application C # à cette question: Obtenir l'événement de déconnexion de système

Autres conseils

Avertissement, comme indiqué ici , gpedit.msc vous permettra de configurer un script de fermeture de session pour tous les utilisateurs .

Si vous n'avez besoin de ce script que pour un utilisateur, vous devez le déclarer directement dans le registre, à la fois dans HKCU et HKLM .

trouvé dans le premier résultat sur google pour moi

Pour exécuter un programme, vous pouvez créer un script pour l’exécuter et utiliser la stratégie de groupe pour l’appliquer. Dans l'éditeur de stratégie de groupe, accédez à Configuration de l'utilisateur - > Paramètres Windows - > Scripts (connexion / déconnexion)

plus d'informations ici

Si vous souhaitez qu'un programme en cours d'exécution exécute du code lors de la fermeture de session, vous devez accrocher le message WM_QUERYENDSESSION et rechercher une valeur lParam de ENDSESSION_LOGOFF (0x80000000).

Il est important de tester cette valeur lParam car les autres indiquent une " fermeture forcée " - c’est-à-dire que votre processus peut être tué avant même que votre code ne soit autorisé à s'exécuter. En fait, la plupart des messages d'arrêt / de fin de session sont uniquement destinés à vous permettre d'exécuter du code de nettoyage de dernière minute et ne sont pas sécuritaires pour répondre à des actions de longue durée; mais cette combinaison particulière devrait être OK.

Remarque: je n’ai jamais essayé d’exécuter un processus séparé en réponse au message WM_QUERYENDSESSION . Il est possible que le gestionnaire de fenêtres l'interdise, comme lors de l'arrêt. Essayez et voyez, je suppose.

Si vous êtes dans un environnement .NET (vous n'avez pas spécifié), un moyen plus rapide consiste à ajouter un gestionnaire d'événements à l'événement Microsoft.Win32.SystemEvents.SessionEnding .

Ce qu'il vous faut, c'est une implémentation de GINA . Vous pouvez exécuter vos commandes personnalisées dans WlxIsLogoffOk . fonction, qui est appelée lorsque l'utilisateur initie une déconnexion

Une fois que vous avez créé la dll GINA appropriée, vous pouvez l'enregistrer ici: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ @GinaDLL

Voici une implémentation qui peut répondre à vos besoins (elle fournit une clé de registre Logoff dans laquelle vous pouvez spécifier votre commande): http://wwwthep.physik.uni-mainz.de/~ frink / newgina_pre09 / readme.html

Comme VonC et TFD l'ont déjà mentionné, l'éditeur de stratégie de groupe n'est qu'un autre moyen de manipuler le registre.

Modifiez simplement avec gpedit les modifications souhaitées (dans Userconfig - Paramètres Windows - Scripts), puis consultez le code dans le registre sous [HKEY_CURRENT_USER \ Software \ Policies \ Microsoft \ Windows \ System \ Scripts] pour savoir comment vous pouvez le faire directement.

Un dossier caché C: \ WINDOWS \ System32 \ GroupPolicy se trouve également sur mon ordinateur (suspendu dans un domaine) avec des sous-dossiers pour l'utilisateur et la machine. Les deux ayant des sous-dossiers supplémentaires appelés Shutdown and Startup. Peut-être que vous pouvez également utiliser ceux-ci.

Si vous avez besoin de quelque chose de simple et fonctionnant pour un seul (ou n'importe quel) utilisateur, vous pouvez créer une application simple en C ++ ou en C #, par exemple.

Le plus simple est d’avoir un bac C # in (en ajoutant simplement le composant bac à la fiche) et d’enregistrer et de gérer les événements pour l’événement FormClosing . Cela ressemblerait à ceci:

    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();
        }
    }

Votre application sera donc démarrée avec Windows ou avec l'utilisateur. Il attendra (en utilisant un peu de mémoire) et fera quelque chose lorsque le système s'arrêtera, ou que l'utilisateur se déconnectera, etc. (en cochant la case "CloseReason" ci-dessus).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top