windows-xp - como - iniciar en modo seguro windows 7 desde cmd
¿Cómo ejecutar mi programa antes de cerrar sesión en Windows XP? (7)
Estoy buscando una versión inversa de "RunOnceEx".
RunOnceEx ejecuta algún programa antes de que comience el shell del usuario (escritorio y barra de tareas). El progreso de inicio de sesión no continuará antes de que se complete el runonceex.
Quiero hacer exactamente lo mismo, pero al cerrar la sesión del usuario. Cuando él / ella cierre la sesión, todo el funcionamiento del cierre del programa, dejando shell (escritorio y barra de tareas), entonces "" Ojalá mi programa se ejecutará en este momento "", finalmente cierre la sesión.
Creo que es posible porque el "mobsync.exe" está haciendo eso. Pero no puedo encontrar dónde y cómo hacerlo.
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 aplicarlo. En el Editor de directivas de grupo, vaya a Configuración de usuario -> Configuración de Windows -> Secuencias de comandos (inicio de sesión / cierre de sesión)
Lo que necesitas es una implementación de GINA . Puede ejecutar sus comandos personalizados en la función WlxIsLogoffOk , que se llama cuando el usuario inicia un cierre de sesión
Una vez que haya creado el dll GINA adecuado, puede registrarlo aquí: HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Winlogon/@GinaDLL
Aquí hay una implementación que puede satisfacer sus necesidades (proporciona una clave de registro de Logoff donde puede especificar su comando): http://wwwthep.physik.uni-mainz.de/~frink/newgina_pre09/readme.html
Como ya mencionaron VonC y TFD, el editor de políticas grupales es solo otra forma de manipular el registro.
Simplemente haga con gpedit los cambios (en Userconfig - Configuración de Windows - Scripts) que le gusten y luego eche un vistazo en el registro en [HKEY_CURRENT_USER/Software/Policies/Microsoft/Windows/System/Scripts]
para descubrir cómo puede hacerlo 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 e Inicio. Quizás también puedas usar estos.
Si desea que un programa en ejecución ejecute código al WM_QUERYENDSESSION
la sesión, debe enganchar 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, es posible que se mate el proceso antes de que se permita ejecutar el código. De hecho, la mayoría de los mensajes de cierre / sesión final solo tienen la intención de darle la oportunidad de ejecutar un código de limpieza de última hora y no es seguro responder con acciones de larga ejecución; pero esta combinación particular debería estar bien.
Nota: nunca intenté ejecutar un proceso por 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 mira, 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
.
Si necesita algo simple y que funcione para un único (o cualquier) usuario, puede hacer una aplicación simple en C ++ o C #, por ejemplo.
Lo más simple es tener una bandeja 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();
}
}
Por lo tanto, su aplicación se iniciará con Windows o con el usuario. Esperará (usando un poco de memoria) y hará algo cuando el sistema se apaga, o el usuario cierra la sesión, etc. (al marcar "CloseReason" arriba).
Advertencia, como se dijo aquí , gpedit.msc
le permitirá configurar un script de cierre de sesión para todos los usuarios .
Si necesita esa secuencia de comandos solo para un usuario, debe declararla directamente en el registro, tanto en HKCU
como en HKLM
.
Para ejecutar esto solo para el usuario actual, puede usar WMI para obtener información cuando se produce un cierre / cierre de sesión.
O escribe un pequeño script C # (o cualquier otro que pueda usar WMI) o vbs para escuchar en el evento Win32_ComputerShutdownEvent WMI.
Aquí se puede encontrar una aplicación C # de ejemplo en esta pregunta: Evento de cerrar sesión del sistema