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.
¿Qué devuelve GetLastError después de que CreateProcessAsUser falla? – Anders
¿Lo has resuelto? Necesito una solución también :) – AgentFire
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 –