Pregunta

instalado un controlador de impresora PostScript y tienen Redmon configuración (redmonnt.dll) para redirigir la salida posdata a mi programa. En mi programa bastante simple c capturo los datos de la entrada estándar y yo soy capaz de éxito guardarlo en un archivo .ps. La apariencia de archivos Aceptar.

Sin embargo, quiero empezar gsview.exe para ver el archivo. Si llamo ShellExecute se produce un error en Windows 7, debido a problemas de permisos. Parece que mi programa se llama bajo una cuenta de usuario diferente (SERVICIO LOCAL). Así que estoy buscando una manera de ejecutar gsview.exe bajo un nombre de usuario específico (el usuario que inició el trabajo de impresión) que está disponible para el programa en una variable llamada REDMON_USER junto con el SessionID también.

Q:? ¿Cuáles son los mínimos WinAPI llamadas necesario para iniciar un programa dado un nombre de usuario y una sessionid

Cualquier ejemplos de código de C / C ++, .NET sería muy útil.

EDIT: Lo que estoy tratando de lograr es algo muy similar a redrunee (de redmonee). No quiero utilizar redrunee porque abre sobre una ventana de consola por un breve momento.

Nota: 1) El programa se llama por el servicio de impresora como cuenta [SERVICIO LOCAL]. 2) El primer parámetro nombre de usuario (REDMON_USER), en efecto, apunta al usuario actualmente mirando a la pantalla

¿Fue útil?

Solución

CreateProcessAsUser .

También se fijan en CreateProcessWithLogonW y CreateProcess.

Ellos están vinculados desde el CreateProcessAsUser

Editar En respuesta a los comentarios de OP.

hilo

Siga el consejo de esta .

copio textualmente esto aquí, en caso de que el enlace original deja de funcionar:

El mismo código funciona para nosotros en Vista como en XP, etc. El servicio se ejecuta como el sistema local.

  1. El uso WTSGetActiveConsoleSessionID para obtener el ID de la corriente activa sesión de Windows en la consola (es decir, el teclado de la máquina y la pantalla, como en contraposición a las sesiones WTS).

  2. El uso WTSQueryUserToken para obtener el token para esa sesión.

  3. uso DuplicateTokenEx (hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, Y hTokenDup) para duplicar esa señal.

  4. El uso CreateEnvironmentBlock para crear un entorno que va a estar pasar al proceso.

  5. El uso CreateProcessAsUser con el duplicado de la ficha y creó ambiente. En realidad, usamos CreateProcessAsUserW, desde la A versión tenía algún tipo de error en algunos los sistemas más antiguos.

  6. No se olvide de CloseHandle en las diversas fichas, etc, y a DestroyEnvironmentBlock la medio ambiente.

Gracias efratian .

PS. Oh alegría de programación de Windows, no lo hizo durante bastante tiempo. Ahora recuerdo por qué. La única cosa que está cerca o incluso peor documentado es la programación de OpenSSH.

Otros consejos

El documentación describe el "Ejecutar como usuario ", el cual parece ser exactamente lo que quiere:

Ejecutar como usuario está destinada a poner en marcha un programa de interfaz gráfica de usuario, tales como GSview localmente a través de RedRun.

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