installer - descargar - installshield virus
Detener MSI desde el lanzamiento de un EXE en el contexto del SISTEMA (3)
Tengo un problema aquí con una implementación de MSI en la que estoy trabajando (usando InstallShield ). Tenemos un programa ejecutándose en segundo plano que debe ejecutarse por usuario, y debe comenzar automáticamente sin la intervención del usuario.
El problema es con el despliegue de objetos de directiva de grupo / Active Directory (GPO / AD). La aplicación se inicia en el contexto del sistema antes de que cualquiera inicie sesión en lugar de como el usuario que está a punto de iniciar sesión. La aplicación solo se puede ejecutar una vez por usuario. y parece que el proceso del SISTEMA evita que se inicie el proceso de USUARIO. Esto significa que las computadoras deben reiniciarse dos veces antes de que el software pueda implementarse para los usuarios. ¿Cómo podemos detener esto?
Básicamente, el flujo de trabajo actual es:
- La instalación / actualización se ejecuta ... mata la aplicación de fondo
- Instalar nuevos archivos
- Aplicación de fondo de inicio
Esto funciona para aplicaciones publicadas e instalaciones de MSI interactivas: solo son aplicaciones ''asignadas'' que parecen tener el problema. Como el paso 3 ocurre en el contexto del SISTEMA en lugar del contexto del usuario :(
Idealmente, haría que el equipo de desarrollo parchee el archivo EXE para evitar el lanzamiento en el contexto del SISTEMA, pero ese es un ciclo de lanzamiento, y estoy buscando una solución basada en el instalador para el interino.
(No sé Installscript ... Así que supongo que VBScript es probablemente el camino a seguir si no hay cosas nativas de InstallShield que pueda usar).
AHA! Sabía que tenía que haber una solución más limpia ... el código en el que estaba trabajando empezaba a verse más o menos así:
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!//" & strComputer & "/root/cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = ''BackgroundProcess.exe''")
For Each objProcess in colProcessList
colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain)
If strNameOfUser = "SYSTEM" Then
objProcess.Terminate()
End If
Next
No confiaría en una propiedad de instalación de Windows para lograr esto. Si entiendo correctamente, quiere ejecutar un archivo EXE una vez por usuario, probablemente para configurar los valores predeterminados del usuario. La única vez que puede garantizar que se encuentra en el contexto correcto es cuando el usuario realmente inicia sesión. Con la cantidad de suplantación en marcha en el escenario promedio de implementación, simplemente no confío en nada más que en un usuario real como el correcto etapa para ejecutar archivos EXE.
Hay demasiadas fuentes de problemas: permisos personalizados y bloqueos de privilegios, bloqueo de servidor de terminal, redireccionamientos de virtualización, suplantación ejecutada por el sistema de despliegue, anulaciones de sistema operativo para escrituras de registro, etc.
Microsoft tiene una característica llamada Active Setup que le permitirá ejecutar "algo ejecutable" una vez por usuario, al iniciar sesión. Esto puede ser cualquier cosa, desde un script hasta un ejecutable. Vea mi respuesta aquí para más detalles: Actualizando el registro de cada perfil en Windows Server 2003
Puede usar la propiedad LogonUser de Windows Installer como una condición para la acción que inicia el EXE.