2010-06-03 14 views
5

He leído todas las publicaciones en Stack Overflow sobre CreateProcessAsUser y hay muy pocas preguntas resueltas, por lo que no estoy conteniendo la respiración en este caso. Pero parece que definitivamente me estoy perdiendo algo, así que podría ser fácil.LogonUser -> CreateProcessAsUser desde un servicio del sistema

El sistema operativo objetivo es Windows XP. Tengo un servicio que se ejecuta como "Sistema local" desde el que quiero crear un proceso ejecutándose como un usuario diferente. Para ese usuario, tengo el nombre de usuario y la contraseña, así que LogonUser va bien y obtengo un token para el usuario (en este caso, una cuenta de administrador). Luego trato de usar ese token para llamar a CreateProcessAsUser, pero falla porque ese token no viene con SeAssignPrimaryTokenPrivilege; sin embargo, tiene SeIncreaseQuotaPrivilege. (Utilicé GetTokenInformation para volcar todos los privilegios asociados con ese token). De acuerdo con la página de MSDN para CreateProcessAsUser, necesita ambos privilegios para llamar a CreateProcessAsUser con éxito.

También dice que no necesita el SeAssignPrimaryTokenPrivilege si el token que pasa a CreateProcessAsUser() es un token primario de "versión restringida del proceso de llamada", que puedo crear con CreateRestrictedToken(), pero luego se asociará con el usuario del sistema local y no con el usuario objetivo con el que intento ejecutar el proceso.

Entonces, ¿cómo crearía un token de inicio de sesión que es tanto una versión restringida del token primario del proceso de llamada, Y está asociado con un usuario diferente? ¡Gracias!

Tenga en cuenta que no hay necesidad de interacción del usuario aquí - es todo desatendido - lo que no hay necesidad de hacer cosas como WinSta0 agarrar, etc.

+1

¿Qué devuelve GetLastError después de que CreateProcessAsUser falla? – Anders

+0

¿Lo has resuelto? Necesito una solución también :) – AgentFire

+0

Los chicos de Google Chrome resolvieron este problema también usando una API de servidor de lanzamiento no documentada que existe hasta XP. Si puedes obtener un token para el usuario que deseas crear el proceso como, usted puede seguir este código aquí: http://src.chromium.org/chrome/trunk/src/remoting/host/win/launch_process_with_token.cc –

Respuesta

4

SE_ASSIGNPRIMARYTOKEN_NAME es un privilegio puede activar en su proceso/hilo con OpenProcessToken/OpenThreadToken + + LookupPrivilegeValue AdjustTokenPrivileges (es fácil confundir esto con TOKEN_ASSIGN_PRIMARY, y MSDN dice que necesita tanto para adjuntar un identificador primario a un proceso)

en esta XP: máquina SP2, sólo llamar LogonUser (... , LOGON32_LOGON_INTERACTIVE, ...) + CreateProcessAsUser funciona perfectamente sin interferir con ningún privilegio (utilizando un servicio cmd.exe falso, pero eso no debería tter)

Esta cita en MSDN:

Si los privilegios necesarios no están ya habilitadas, CreateProcessAsUser les permite durante la duración de la llamada

y el hecho de que son funcionando como SISTEMA y debería ser capaz de habilitar cualquier privilegio me lleva a creer que este asignar cosas primarias no es el problema.

+0

Tiene razón, resultó ser una pista falsa . Sin embargo, este es un conocimiento útil para más adelante. Gracias. –

Cuestiones relacionadas