Problemas con CreateProcessAsUser (A required privilege is not held by the client)

15/07/2004 - 13:25 por Jordi Gou | Informe spam
Hola,

Estoy desarrollando un setup que debe instalar un servicio
independientemente de los derechos del usuario que lo ejecute. Para ello se
pide login y password de administrador durante la instalación si se trata de
un usuario restringido.

Usando LogonUser y ImpersonateLoggedOnUser consigo que el proceso actual
tenga derechos de administrador. Con ello consigo escribir en la entrada
LocalMachine del registro y extraer los archivos en el directorio de
"Archivos de Programa" correspondiente.

De todas formas, al tratarse de un servicio necesito ejecutar sentencias
tipo "net start <nombre_servicio>" que necesitan derechos de administrador
para ejecutarse. He leido y he podido comprovar que al llamar un
ShellExecute o WinExec no se heredan los privilegios del Impersonate sino
los del proceso original. Por tanto, debo usar CreateProcessAsUser para
poder ejecutar estos comandos.

Al ejecutar CreateProcessAsUser me da el error "A required privilege is not
held by the client". Le paso una copia del token que he usado para hacer el
Impersonate que me retorna el DuplicateTokenEx al que llamo de la siguiente
manera:

////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////
DuplicateTokenEx(hAdminUser, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation,
TokenPrimary, &hAdminPriv);

PROCESS_INFORMATION processInfo;

STARTUPINFO startUpInfo;

DWORD dwPrio;


memset((void *)&startUpInfo, 0, sizeof(startUpInfo));

startUpInfo.cb = sizeof(STARTUPINFO);

dwPrio = CREATE_NO_WINDOW;

startUpInfo.lpDesktop = NULL;


startUpInfo.dwFlags = 0;

startUpInfo.lpTitle = TEXT("lala");




my_strcpy(szRes, TEXT("C:\\Documents and
Settings\\prova\\Escritorio\\prova.exe"));

CreateProcessAsUser(hAdminPriv, szRes, szRes, NULL, NULL, TRUE, dwPrio,
NULL, NULL, &startUpInfo, &processInfo);

////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////

Como se puede ver, le pongo acceso total para que no me dé el problema que
tengo pero no parece que lo resuelva. Alguien me podría ayudar? No sé qué
probar, he probado código de ejemplos que eh encontrado por internet pero
tambien me da el mismo error. Es que hay algun problema en hacer esto con
usuarios no privilegiados? No lo creo porque no es algo tan extraño, no?

Gracias

Jordi
 

Leer las respuestas

#1 Alejandro Campos Magencio [MS]
16/07/2004 - 14:12 | Informe spam
Según MSDN, quien llame a CreateProcessAsUser necesita los privilegios
SE_ASSIGNPRIMARYTOKEN_NAME (Replace a process level token) y
SE_INCREASE_QUOTA_NAME (Increase quotas). ¿El usario que estás utilizando
tiene esos privilegios?

Un saludo,

Alejandro Campos Magencio [MS]

Este mensaje se proporciona "como está" sin garantías de ninguna clase, y no
otorga ningún derecho.
"Jordi Gou" wrote in message
news:
Hola,

Estoy desarrollando un setup que debe instalar un servicio
independientemente de los derechos del usuario que lo ejecute. Para ello
se
pide login y password de administrador durante la instalación si se trata
de
un usuario restringido.

Usando LogonUser y ImpersonateLoggedOnUser consigo que el proceso actual
tenga derechos de administrador. Con ello consigo escribir en la entrada
LocalMachine del registro y extraer los archivos en el directorio de
"Archivos de Programa" correspondiente.

De todas formas, al tratarse de un servicio necesito ejecutar sentencias
tipo "net start <nombre_servicio>" que necesitan derechos de administrador
para ejecutarse. He leido y he podido comprovar que al llamar un
ShellExecute o WinExec no se heredan los privilegios del Impersonate sino
los del proceso original. Por tanto, debo usar CreateProcessAsUser para
poder ejecutar estos comandos.

Al ejecutar CreateProcessAsUser me da el error "A required privilege is
not
held by the client". Le paso una copia del token que he usado para hacer
el
Impersonate que me retorna el DuplicateTokenEx al que llamo de la
siguiente
manera:

////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////
DuplicateTokenEx(hAdminUser, TOKEN_ALL_ACCESS, NULL,
SecurityImpersonation,
TokenPrimary, &hAdminPriv);

PROCESS_INFORMATION processInfo;

STARTUPINFO startUpInfo;

DWORD dwPrio;


memset((void *)&startUpInfo, 0, sizeof(startUpInfo));

startUpInfo.cb = sizeof(STARTUPINFO);

dwPrio = CREATE_NO_WINDOW;

startUpInfo.lpDesktop = NULL;


startUpInfo.dwFlags = 0;

startUpInfo.lpTitle = TEXT("lala");




my_strcpy(szRes, TEXT("C:\\Documents and
Settings\\prova\\Escritorio\\prova.exe"));

CreateProcessAsUser(hAdminPriv, szRes, szRes, NULL, NULL, TRUE, dwPrio,
NULL, NULL, &startUpInfo, &processInfo);

////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////

Como se puede ver, le pongo acceso total para que no me dé el problema que
tengo pero no parece que lo resuelva. Alguien me podría ayudar? No sé qué
probar, he probado código de ejemplos que eh encontrado por internet pero
tambien me da el mismo error. Es que hay algun problema en hacer esto con
usuarios no privilegiados? No lo creo porque no es algo tan extraño, no?

Gracias

Jordi


Preguntas similares