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

Preguntas similare

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


Respuesta Responder a este mensaje
#2 Jordi Gou
16/07/2004 - 15:56 | Informe spam
A ver, he conseguido añadir estos privilegios al Token que se utilizará para
crear el nuevo proceso con CreateProcessAsUser, ya que el primero no lo
tiene ni el administrador de mi máquina y habilitarlos.

Antes de hacer esto el error me daba hasta si usaba el usuario administrador
para ejecutar mi programa, pero añadiendo estos privilegios al token el
programa funciona si lo ejecuto des de la cuenta de un administrador pero no
si lo ejecuto desde la cuenta de un usuario limitado.

Esto es muy extraño porque a partir de hacer un LogonUser los privilegios
tendrían que ser los mismos puesto que el token pasa a ser el mismo en ambos
casos. De hecho, en el log que tengo me salen los mismos privilegios activos
en los dos casos. Me explico:

Usuario administrador -> <LogonUser> => Administrator ->
<Añadir_privilegios_al_token> -> <CreateProcessAsUser> => La acción del
programa es correcta

Usuario limitado -> <LogonUser> => Administrator ->
<Añadir_privilegios_al_token> -> <CreateProcessAsUser> => retorna el error
1314 (A required privilege is not held by the client)

Me puedes ayudar porque no sé por donde debo seguir? Además he bajado algun
programa que teoricamente hace un runas pero parece no funcionar si no el
usuario que lo ejecuta no es administrador. De todas maneras, esto se tiene
que poder hacer porque sino como lo hacen los setups que piden Login y
password de administrador??

Gracias

Jordi


"Alejandro Campos Magencio [MS]" wrote in
message news:
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
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida