tutorial que licencia funciones componentes caracteristicas winapi windows-nt

winapi - que - windows nt funciones



CreateProcessAsUser frente a ShellExecute (4)

Puede ajustar ShellExecute entre ImpersonateLoggedOnUser / RevertToSelf

enlaces: ImpersonateLoggedOnUser: http://msdn.microsoft.com/en-us/library/aa378612(VS.85).aspx RevertToSelf: http://msdn.microsoft.com/en-us/library/aa379317.aspx

lo siento, no puedo hipervincular URL con "()"

Necesito ShellExecute algo como otro usuario, actualmente empiezo un proceso de ayuda con CreateProcessAsUser que llama a ShellExecute , pero eso parece demasiado pirateo (proceso padre incorrecto, etc.) ¿Hay una mejor manera de hacerlo?

@PabloG: ImpersonateLoggedOnUser no funciona:

HANDLE hTok; VERIFY(LogonUser("otheruser",0,"password",LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hTok)); VERIFY(ImpersonateLoggedOnUser(hTok)); ShellExecute(0,0,"calc.exe",0,0,SW_SHOW); RevertToSelf(); CloseHandle(hTok);

solo comenzará a calc como el usuario conectado, no como "otheruser"

@ 1800 INFORMACIÓN: CreateProcess / CreateProcessAsUser no es lo mismo que ShellExecute , con UAC en Vista, CreateProcess es inútil cuando no tienes control sobre qué programa está ejecutando el usuario ( CreateProcess devolverá un error si le das un archivo exe con un manifiesto marcado como requireAdmin)

@Brian R. Bondy: Ya sé esta información (y no me malinterpreten, es bueno), pero está fuera de tema (en mi humilde opinión) estoy pidiendo un ShellExecuteAsUser , no sobre los procesos de inicio como otro usuario, ya saber cómo hacer eso.


¿Por qué no haces CreateProcessAsUser especificando el proceso que deseas ejecutar?

También es posible que pueda usar SHCreateProcessAsUserW.


La solución realmente depende de cuáles sean sus necesidades y puede ser bastante compleja (gracias totalmente a Windows Vista). Esto probablemente va más allá de su necesidad, pero esto ayudará a otros que encuentren esta página a través de la búsqueda.

  1. Si no necesita el proceso para ejecutar con una GUI y no necesita elevación
  2. Si el usuario que desea ejecutar ya está conectado a una sesión
  3. Si necesita ejecutar el proceso con una GUI, y el usuario puede, o no, haber iniciado sesión
  4. Si necesita ejecutar el proceso con elevación

En cuanto a 1: en Windows Vista existe algo llamado aislamiento de sesión 0. Todos los servicios se ejecutan como la sesión 0 y no se supone que tenga una GUI en la sesión 0. El primer usuario conectado está conectado a la sesión 1. En versiones anteriores de Windows (antes de Vista), el primer usuario conectado también se ejecutó por completo en sesión 0.

Puede ejecutar varios procesos diferentes con diferentes nombres de usuario en la misma sesión. Aquí puede encontrar un buen documento sobre el aislamiento de la sesión 0.

Como estamos tratando con la opción 1), no necesita una GUI. Por lo tanto, puede comenzar su proceso en la sesión 0.

Querrá una secuencia de llamadas como esta: Usuario de inicio de sesión, ExpandEnvironmentStringsForUser, GetLogonSID, LoadUserProfile, CreateEnvironmentBlock, CreateProcessAsUser.

El código de ejemplo para esto se puede encontrar a través de cualquier motor de búsqueda, o a través de la búsqueda de código de Google

En relación con 2: si el usuario desea ejecutar el proceso como ya inició sesión, puede usar simplemente: WTSEnumerateSessions y WTSQuerySessionInformation para obtener el ID de sesión, y luego WTSQueryUserToken para obtener el token del usuario. Desde allí, puede usar el token de usuario en la API CreateProcessAsUser Win32.

Este es un excelente método porque ni siquiera necesita iniciar sesión como usuario ni conocer el nombre de usuario / contraseña del usuario. Creo que esto solo es posible a través de un servicio que se ejecuta como cuenta del sistema local.

Puede obtener la sesión actual a través de WTSGetActiveConsoleSessionId.

Con respecto a 3: Seguiría los mismos pasos que en el n. ° 1, pero además usaría el campo lpDesktop de STARTUPINFO. Establezca esto en winsta0 / Default. También deberá intentar utilizar la API de OpenDesktop Win32 y, si esto no funciona, puede CreateDesktop. Antes de usar la estación y los controladores de escritorio, debe usar SetSecurityInfo en cada uno de ellos con SE_WINDOW_OBJECT y GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION.

Si el usuario en cuestión más tarde intenta iniciar sesión, verá el proceso en ejecución.

Con respecto a 4: esto también se puede hacer, pero requiere que ya esté ejecutando un proceso elevado. Un servicio que se ejecuta como cuenta de sistema local se ejecuta como elevado. También podría hacerlo funcionar teniendo un proceso autenticado firmado que quisiera iniciar. El proceso que desea iniciar también debe tener un archivo de manifiesto asociado con el nivel requerido Execution Level = "requireAdministrator"

Otras notas:

  • Puede establecer una sesión de token a través de SetTokenInformation y TokenSessionId
  • No puede cambiar la ID de sesión de un proceso ya en ejecución.
  • Todo este proceso sería drásticamente más simple si Vista no estuviera en la ecuación.

Si necesita la semántica de ShellExecute, puede alimentar lo siguiente:

C:/windwos/system32/cmd.exe /k" start <your_target_to_be_ShellExecuted>" to CreateProcessAsUser y listo.