2009-09-25 21 views
9

Quiero crear un proceso en otro usuario. Entonces uso LogonUser y CreateProcessAsUser. Pero mi problema es que CreatePtocessAsUser siempre devuelve el código de error 1314, lo que significa que "Un privilige requerido no está en manos del cliente". Entonces mi pregunta es, ¿qué estoy haciendo mal? ¿O cómo puedo dar prioridad a los privilegios? (Creo que el identificador debe tener los privilegios, o estoy equivocado?) Lo siento por mis errores en inglés, pero mi conocimiento del inglés no es el mejor :)CreateProcessAsUser error 1314

Plesase ayuda si alguien sabe cómo corregir mi aplicación.

Esto es parte de mi código.

STARTUPINFO StartInfo; 
PROCESS_INFORMATION ProcInfo; 
TOKEN_PRIVILEGES tp; 
memset(&ProcInfo, 0, sizeof(ProcInfo)); 
memset(&StartInfo, 0 , sizeof(StartInfo)); 
StartInfo.cb = sizeof(StartInfo); 
HANDLE handle = NULL; 

if (!OpenProcessToken(GetCurrentProcess(), 
TOKEN_ALL_ACCESS, &handle)) printf("\nOpenProcessError"); 

if (!LookupPrivilegeValue(NULL,SE_TCB_NAME, 
//SE_TCB_NAME, 
&tp.Privileges[0].Luid)) { 
printf("\nLookupPriv error"); 
} 

tp.PrivilegeCount = 1; 
tp.Privileges[0].Attributes = 
SE_PRIVILEGE_ENABLED;//SE_PRIVILEGE_ENABLED; 
if (!AdjustTokenPrivileges(handle, FALSE, &tp, 0, NULL, 0)) { 
printf("\nAdjustToken error"); 
} 

i = LogonUser(user, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &handle); 
printf("\nLogonUser return : %d",i); 
i = GetLastError(); 
printf("\nLogonUser getlast : %d",i); 
if (! ImpersonateLoggedOnUser(handle)) printf("\nImpLoggedOnUser!"); 

i = CreateProcessAsUser(handle, "c:\\windows\\system32\\notepad.exe",NULL, NULL, NULL, true, 
CREATE_UNICODE_ENVIRONMENT |NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, NULL, NULL, 
&StartInfo, &ProcInfo);  
printf("\nCreateProcessAsUser return : %d",i); 
i = GetLastError(); 
printf("\nCreateProcessAsUser getlast : %d",i); 

CloseHandle(handle); 
CloseHandle(ProcInfo.hProcess); 
CloseHandle(ProcInfo.hThread); 

¡Gracias de antemano!

+0

Tiene suerte de que incluso saber el número de error La forma correcta de llamar a GetLastError es llamarlo inmediatamente después de llamar a una API, si la API falla. Si llama a algo más en el medio (por ejemplo, printf) entonces GetLastError generalmente le dará un error posterior en lugar del error que deseaba. –

+0

Sí, tiene razón, y yo también lo sé, pero traté de muchas maneras de resolver este problema, y ​​olvidé eliminar el printf. Mi error :( – kampi

+0

ERROR_PRIVILEGE_NOT_HELD solo en caso de que alguien busque el nombre del error y no 1314. –

Respuesta

15

la cuenta local que ejecuta su aplicación debe tener estos privilegios activados en la política de seguridad local:

  • Actuar como parte del sistema operativo
  • Crear un objeto testigo
  • sesión como trabajo por lotes
+1

Hola! Quiero usar un dominio y una cuenta local también. Creo que tal vez la creación de un token sea la forma más fácil, y Espero que funcione en ambas cuentas. ¿Podría darme un ejemplo de código, cómo generar un objeto token con los privilegios necesarios? Gracias, kampi – kampi

+1

¿Cómo puedo configurar esos privilegios? – Joel

+0

Para todos los que vienen por: No lo hice No necesito los dos primeros (aunque ya estoy en "Iniciar sesión como trabajo por lotes").En cambio, finalmente conseguí que funcionara agregando "Reemplazar un token de nivel de proceso" como sugirió @Patel. –

0

Su código agrega el privilegio SE_TCB_NAME a su token.

MSDN dice "Normalmente, el proceso que llama a la función CreateProcessAsUser debe tener los privilegios SE_ASSIGNPRIMARYTOKEN_NAME y SE_INCREASE_QUOTA_NAME."

+0

Sí, eso también lo sé. Mi problema es que, ¿cómo debería agregar estos privilegios? si intento esto: si me sale el error (LookupPrivilegeValue (NULL, SE_ASSIGNPRIMARYTOKEN_NAME y SE_INCREASE_QUOTA_NAME, y tp.Privileges [0] .Luid)!): Operandos inválidos de tipos a operador binario 'y' Así ¿Cómo agrego estos dos privilegios al mismo tiempo? – kampi

+4

Pedí un poco de ayuda (algunos códigos de trabajo o explicaciones). ¡Si no quieres ayudar, entonces no agregues comentarios por favor! – kampi

0

Revisé los enlaces y funcionó bien. Check this

void main() 
{ 

DWORD dwSessionId; 
HANDLE hToken = NULL; 

TOKEN_PRIVILEGES tp; 
PROCESS_INFORMATION pi; 
STARTUPINFOW si; 

// Initialize structures. 
ZeroMemory(&tp, sizeof(tp)); 
ZeroMemory(&pi, sizeof(pi)); 
ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 


LPTSTR lpszUsername = "user\0"; 
LPTSTR lpszDomain = ".";//"bgt\0"; 
LPTSTR lpszPassword = "password\0"; 

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY 
| TOKEN_ADJUST_PRIVILEGES , &hToken)) { 

MyError(); 
} 



// Look up the LUID for the TCB Name privilege. 
if (!LookupPrivilegeValue(NULL,SE_TCB_NAME, //SE_SHUTDOWN_NAME , 
//SE_TCB_NAME, 
&tp.Privileges[0].Luid)) { 
MyError(); 
} 


tp.PrivilegeCount = 1; 
tp.Privileges[0].Attributes = 
SE_PRIVILEGE_ENABLED;//SE_PRIVILEGE_ENABLED; 
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, 0)) { 

MyError(); 
} 


if(LogonUser(lpszUsername,lpszDomain,lpszPassword, 
LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hToken) == 0) 
{ 
MyError(); 
} 
else 
{ 
STARTUPINFO sInfo; 
PROCESS_INFORMATION ProcessInfo; 
memset(&sInfo,0,sizeof(STARTUPINFO)); 
sInfo.cb = sizeof(STARTUPINFO); 
sInfo.dwX = CW_USEDEFAULT; 
sInfo.dwY = CW_USEDEFAULT; 
sInfo.dwXSize = CW_USEDEFAULT; 
sInfo.dwYSize = CW_USEDEFAULT; 


bool bRet = CreateProcessAsUser(hToken, 
"c:\\windows\\system32\\notepad.exe", 
NULL, 
NULL, 
NULL, 
TRUE, 
CREATE_NEW_CONSOLE, 
NULL, 
NULL, 
&sInfo, 
&ProcessInfo); 

if(bRet == 0) 
MyError(); 
} 
2

Después de buscar respuesta durante horas, finalmente me encontré en siguiente enlace de MSDN. Espero que pueda ayudar a alguien en el futuro.

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c905c900-cae1-4081-b0c9-00f10238e7ad/createprocessasuser-failed?forum=clr

"Para resolver este problema, tendrá que elevar los derechos de la cuenta de llamadas CreateProcessAsUser con el 'Sustituir un símbolo de nivel de proceso' derecha. Para ello, abra el Panel de control/Herramientas administrativas/Política de seguridad local y agregue la cuenta de usuario al símbolo "Reemplazar un token de nivel de proceso" (puede que tenga que cerrar sesión o incluso reiniciar para que este cambio surta efecto) "

Cuestiones relacionadas