CreateProcessAsUser ошибка 1314
Я хочу создать процесс под другим пользователем. Поэтому я использую LogonUser и CreateProcessAsUser. Но моя проблема в том, что CreatePtocessAsUser всегда возвращает errorcode 1314, что означает, что "требуемый privilige не удерживается клиентом". Итак, мой вопрос в том, что я делаю неправильно? Или как я могу дать привилегии ручке? (Я думаю, что ручка должна иметь привилегии, или я ошибаюсь?) Извините за мои английские ошибки, но мои знания английского языка не самые лучшие:)
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:windowssystem32notepad.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);
спасибо заранее!
4 ответов
локальная учетная запись, на которой выполняется приложение, должна иметь эти права в локальной политике безопасности:
- действовать как часть операционной системы
- создать объект токена
- войдите в систему как пакетное задание
после поиска ответа в течение нескольких часов, я, наконец, нашел его в следующей ссылке из MSDN. Надеюсь, это может помочь кому-то в будущем.
" чтобы решить эту проблему, вам нужно повысить права учетной записи, вызывающей CreateProcessAsUser с помощью "замена маркера уровня процесса" право. Для этого откройте Панель управления / Администрирование / Локальная политика безопасности и добавьте учетную запись пользователя в право "заменить токен уровня процесса". (Возможно, вам придется выйти из системы или даже перезагрузиться, чтобы это изменение вступило в силу.)"
ваш код добавляет привилегию SE_TCB_NAME к вашему токену.
MSDN говорит: "обычно процесс, вызывающий функцию CreateProcessAsUser, должен иметь привилегии SE_ASSIGNPRIMARYTOKEN_NAME и SE_INCREASE_QUOTA_NAME."
Я проверил ссылки, и это сработало хорошо. проверить это
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";
LPTSTR lpszDomain = ".";//"bgt";
LPTSTR lpszPassword = "password";
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();
}