2009-09-25 5 views
9

Я хочу создать процесс под другим пользователем. Поэтому я использую 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); 

Заранее благодарен!

+0

Вам повезло, что вы даже знать номер ошибки. Правильный способ вызова GetLastError - вызывать его сразу после вызова API, если API завершился неудачно. Если вы вызываете что-либо еще между ними (например, printf), то GetLastError обычно дает вам более позднюю ошибку вместо требуемой ошибки. –

+0

Да, вы правы, и я тоже это знаю, но я пробовал так много способов решить эту проблему, и я забыл удалить printf. Моя ошибка :( – kampi

+0

ERROR_PRIVILEGE_NOT_HELD на всякий случай, если кто-то ищет имя ошибки, а не 1314. –

ответ

15

Локальная учетная запись, которая работает ваше приложение должны иметь эти привилегии включены в локальной политике безопасности:

  • Действовать как часть операционной системы
  • Создания маркерного объекту
  • Входа в качестве пакетное задание
+1

Привет! Я хочу использовать домен и локальную учетную запись. Я думаю, возможно, создание объекта токена было бы самым простым способом и Я надеюсь, что это будет работать на обеих учетных записях. Не могли бы вы дать мне пример кода, как создать объект токена с требуемыми привилегиями? Спасибо, kampi – kampi

+1

Как установить эти привилегии? – Joel

+0

Для всех, кто пришел: 't в конечном итоге нуждаются в первых двух из них (хотя я уже в «Войти как пакетное задание»).Вместо этого я, наконец, получил его для работы, добавив «Заменить токен уровня процесса», как предположил @Patel. –

0

Ваш код добавляет привилегии SE_TCB_NAME к вашему токену.

MSDN говорит: «Как правило, процесс, вызывающий функцию CreateProcessAsUser, должен иметь привилегии SE_ASSIGNPRIMARYTOKEN_NAME и SE_INCREASE_QUOTA_NAME».

+0

Да, я тоже это знаю. Моя проблема заключается в том, как мне добавить эти привилегии? Если я попробовать это: если я получаю ошибку (LookupPrivilegeValue (NULL, SE_ASSIGNPRIMARYTOKEN_NAME & SE_INCREASE_QUOTA_NAME, & tp.Privileges [0] .Luid)!): Invalid операндов типов в бинарный оператор '&' So как добавить эти две привилегии в одно и то же время? – kampi

+4

Я попросил некоторую помощь (некоторый рабочий код или объяснение). Если вы не хотите помогать, то не добавляйте комментарии, пожалуйста! – kampi

0

Я проверил ссылки, и это сработало хорошо. 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

После ищет ответ в течение нескольких часов, я, наконец, нашел его в следующую ссылку из MSDN. Надеюсь, это может помочь кому-то в будущем.

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

«Чтобы решить эту проблему, вам необходимо поднять права учетной записи вызывающего CreateProcessAsUser с „Замена маркера уровня процесса“ право. Для этого откройте Панель управления/Администрирование/Локальная политика безопасности и добавьте учетную запись пользователя в «Заменить токен уровня процесса». (Возможно, вам придется выйти из системы или даже перезагрузить, чтобы это изменение вступило в силу.) «

Смежные вопросы