Перелистал я ветки форума и к сожалению предлагаемые решения по устранению неприятностей с CreateProcessAsUser не помогают.
Решил задать вопрос.
Окружение: OS MS Windws VISTA (64bit)
Я пытаюсь запустить процес с помощью CreateProcessAsUser как Администратор (сесия будет > 0) из процесса у которого права SYSTEM (т.е. службы), который как известно выполняется в 0 сесии.
Вот такой вариант на ХР проходит без ошибок, а на VISTA возникает следующая ошибка: Error 5 — Access denied. Непонятно что не верно
WCHAR szTemp[MAX_PATH] = L"C:\\WINDOWS\\system32\\cmd.exe";
WCHAR szUsername[MAX_PATH] = L"Administrator";
WCHAR szDomain[MAX_PATH] = L".";
WCHAR szPassword[MAX_PATH] = L"pass";
HANDLE hToken;
PROCESS_INFORMATION pi;
STARTUPINFO si;
BOOL bResult = FALSE;
//
// Здесь пропущен код создания winsta0\\default описаный в MSDN
// [msdn]Starting an Interactive Client Process in C++[/msdn]
// Без него (если NULL) окна запущеного приложения не польностью будут отображаться
//
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = L"winsta0\\default";
bResult = LogonUser(szUsername,szDomain,szPassword,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,&hToken) )
if (!bResult)
DisplayError(L"LogonUser Failed");
bResult = CreateProcessAsUser(
hToken, // client's access token
NULL, // file to execute
szTemp, // command line
NULL, // pointer to process SECURITY_ATTRIBUTES
NULL, // pointer to thread SECURITY_ATTRIBUTES
FALSE, // handles are not inheritable
NULL, // creation flags
NULL, // pointer to new environment block
NULL, // name of current directory
&si, // pointer to STARTUPINFO structure
&pi // receives information about new process
);
if (!bResult)
DisplayError(L"CreateProcessAsUser Failed");
if (bResult && pi.hProcess != INVALID_HANDLE_VALUE)
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
}
if (pi.hThread != INVALID_HANDLE_VALUE)
CloseHandle(pi.hThread);
if (hToken != INVALID_HANDLE_VALUE)
CloseHandle(hToken);
Перепробовал уже несколько вариантов:
1. Пробовал после LogonUser вызывать функцию:
HANDLE hdToken;
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle = true;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
DuplicateTokenEx( hToken, MAXIMUM_ALLOWED ,&sa, SecurityIdentification, TokenPrimary, &hdToken))
2. Пробовал и как в MSDN через такой десктоп "winsta0\\default" и потом делать ImpersonateLoggedOnUser(hToken).
3. Пробовал разрешать привелегии SE_ASSIGNPRIMARYTOKEN_NAME и SE_INCREASE_QUOTA_NAME.(
"Enabling and Disabling Privileges in C++)
4. Експерементировал с флагами CreateProcessAsUser, создавал окружение.
Буду премного благодарен за Ваше внимание к вопросу!