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!
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. –
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
ERROR_PRIVILEGE_NOT_HELD solo en caso de que alguien busque el nombre del error y no 1314. –