Pregunta

Estoy buscando una versión inversa de "RunOnceEx".

RunOnceEx ejecuta algún programa, antes de que se inicie el shell del usuario (escritorio y barra de tareas). El progreso de inicio de sesión no continuará antes de que se complete runonceex.

Quiero hacer exactamente lo mismo pero al cerrar la sesión del usuario. Cuando ella / él cierra la sesión, todos los programas en ejecución se apagan, dejando el shell (escritorio y barra de tareas), y luego "Deseo que mi programa se ejecute en este momento", finalmente cierre sesión.

Creo que es posible porque el " mobsync.exe " está haciendo eso Pero no puedo encontrar dónde y cómo hacerlo.

¿Fue útil?

Solución

Para ejecutar esto solo para el usuario actual, puede usar WMI para obtener información cuando se produce un apagado / cierre de sesión.

Puede escribir una pequeña aplicación de C # (o cualquier otro lenguaje que pueda usar WMI) o un script vbs para escuchar el evento WMI Win32_ComputerShutdownEvent .

Aquí se puede encontrar una aplicación de ejemplo de C # en esta pregunta: Obtener evento de desconexión de sistema

Otros consejos

Advertencia, como se dice aquí , gpedit.msc le permitirá configurar un script de cierre de sesión para todos usuarios .

Si necesita ese script solo para un usuario, debe declararlo directamente en el registro, tanto en HKCU como HKLM .

encontrado en el primer resultado en google para mí

Para ejecutar un programa, puede crear un script para ejecutarlo y usar la política de grupo para imponerlo. En el Editor de directivas de grupo, vaya a Configuración de usuario - > Configuración de Windows - > Scripts (inicio / cierre de sesión)

más información aquí

Si desea que un programa en ejecución ejecute código al cerrar sesión, debe conectar el mensaje WM_QUERYENDSESSION y buscar un valor lParam de ENDSESSION_LOGOFF (0x80000000).

Es importante probar este valor de lParam porque los otros indican un "cierre forzado" - es decir, su proceso puede ser cancelado antes de que su código pueda ejecutarse. De hecho, la mayoría de los mensajes de cierre / finalización de sesión solo tienen la intención de darle la oportunidad de ejecutar el código de limpieza de último minuto y no son tan seguros de responder con acciones de larga duración; pero esta combinación particular debería estar bien.

Nota: Nunca he intentado ejecutar un proceso separado en respuesta al mensaje WM_QUERYENDSESSION . Es posible que el administrador de ventanas no permita esto, como lo hace durante el apagado. Pruébalo y verás, supongo.

Si está en un entorno .NET (no especificó), una forma más rápida es agregar un controlador de eventos al evento Microsoft.Win32.SystemEvents.SessionEnding .

Lo que necesita es una implementación de GINA . Puede ejecutar sus comandos personalizados en WlxIsLogoffOk función, que se llama cuando el usuario inicia un cierre de sesión

Una vez que cree el dll de GINA apropiado, puede registrarlo aquí: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ @GinaDLL

Aquí hay una implementación que puede ajustarse a sus necesidades (proporciona una clave de registro de cierre de sesión donde puede especificar su comando): http://wwwthep.physik.uni-mainz.de/~ frink / newgina_pre09 / readme.html

Como VonC y TFD ya mencionaron, el Editor de directivas de grupo es solo otra forma de manipular el registro.

Simplemente realice con gpedit los cambios (en Userconfig - Configuración de Windows - Scripts) que desee y luego eche un vistazo en el registro en [HKEY_CURRENT_USER \ Software \ Policies \ Microsoft \ Windows \ System \ Scripts] para descubrir cómo puedes hacer eso directamente.

También en mi PC (colgado en un dominio) hay una carpeta oculta C: \ WINDOWS \ System32 \ GroupPolicy con subcarpetas para el usuario y la máquina. Ambos tienen subcarpetas adicionales llamadas Apagado y Inicio. Tal vez también pueda usar estos.

Si necesita algo simple y funciona para un solo (o cualquier) usuario, puede hacer una aplicación simple en C ++ o C #, por ejemplo.

Lo más simple es tener una C # en la bandeja (simplemente agregando el componente de la bandeja al formulario) y registrar y manejar el evento para el evento FormClosing . Se vería así:

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

Entonces su aplicación se iniciará con Windows o con el usuario. Esperará (usando un poco de memoria) y hará algo cuando el sistema se apague, o el usuario cierre sesión, etc. (marcando " CloseReason " arriba).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top