Я хочу создать процесс под другим пользователем. Поэтому я использую LogonUser и CreateProcessAsUser. Но моя проблема заключается в том, что CreatePtocessAsUser всегда возвращает код ошибки 1314, что означает, что «Требуемая привилегия не удерживается клиентом». Итак, мой вопрос: что я делаю неправильно? Или как я могу дать priviliges ручке? (Я думаю, что ручка должна обладать привилегиями или я ошибаюсь?) Извините за мои английские ошибки, но мои знания в английском не самые лучшие :)Ошибка CreateProcessAsUser 1314
Plesase помогите, если кто-нибудь знает, как исправить мое приложение.
Это часть моего кода.
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);
Заранее благодарен!
Вам повезло, что вы даже знать номер ошибки. Правильный способ вызова GetLastError - вызывать его сразу после вызова API, если API завершился неудачно. Если вы вызываете что-либо еще между ними (например, printf), то GetLastError обычно дает вам более позднюю ошибку вместо требуемой ошибки. –
Да, вы правы, и я тоже это знаю, но я пробовал так много способов решить эту проблему, и я забыл удалить printf. Моя ошибка :( – kampi
ERROR_PRIVILEGE_NOT_HELD на всякий случай, если кто-то ищет имя ошибки, а не 1314. –