CreateProcessAsUser in Vista
От: ZVlad  
Дата: 28.09.06 13:49
Оценка:
Перелистал я ветки форума и к сожалению предлагаемые решения по устранению неприятностей с 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, создавал окружение.

Буду премного благодарен за Ваше внимание к вопросу!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.