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