Выдавать себя за обычного пользователя - PullRequest
4 голосов
/ 17 февраля 2010

Я пытаюсь запустить мой процесс, который повышен до перезапуска проводника, используя стандартный токен пользователя.

Сначала я запускаю основной процесс как администратор, а затем делаю снимок запуска:

if (Process32First(hSnapshot,&pe32))
    {
        do
        {
            if (!wcsicmp(pe32.szExeFile, L"explorer.exe"))
            {
                DWORD dwExplorerSessId = 0;
                if (ProcessIdToSessionId(pe32.th32ProcessID, &dwExplorerSessId) && dwExplorerSessId == dwSessionId)
                {
                    dwExplorerLogonPid = pe32.th32ProcessID;
                    break;
                }
            }

        } while (Process32Next(hSnapshot, &pe32));
    }

    CloseHandle(hSnapshot);

затем, как только я получу PID explorer, который работает под стандартной учетной записью пользователя, я звоню:

OpenProcessToken(hProcess,TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_IMPERSONATE
            ,&hPToken))

тогда я звоню:

ImpersonateLoggedOnUser(hPToken);

и, наконец, я taskkill explorer.exe и оболочка выполняет его снова, но он запускается с правами администратора.

Как будто impersonateLoggedonUser не работает. Хотя он возвращает true, а GetLastError () возвращает 0;

Я также пытался использовать CreateProcessAsUser (), но это всегда дает ERROR_FILE_NOT_FOUND:

    STARTUPINFO si;
    GetStartupInfo(&si);                
    PROCESS_INFORMATION pi;
    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));

    TCHAR tchcmd[MAX_PATH];
    _tcscpy(tchcmd, _T("explorer.exe"));
    PVOID penv;
    CreateEnvironmentBlock(&penv, hToken, FALSE);
HANDLE hNewToken;
DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityIdentification, TokenImpersonation, &hNewToken);
    CreateProcessAsUser(, NULL, tchcmd, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, penv, 0, &si, &pi );

Любые идеи или предложения.

Ответы [ 2 ]

3 голосов
/ 17 февраля 2010

Вы звоните DuplicateTokenEx на токене перед его использованием? Вы должны.

Вместо ImpersonateLoggedOnUser вы могли бы просто вызвать CreateProcessAsUser .

Изменить, чтобы соответствовать вашему:

  • Кстати, ваш CreateProcessAsUser должен передать: CREATE_DEFAULT_ERROR_MODE | CREATE_UNICODE_ENVIRONMENT для dwCreationFlags.

  • Вы также должны быть ошибочными при проверке вашего CreateEnvironmentBlock.

  • Вы также должны настроить Ace из desktop и window station.

  • Вместо того, чтобы указывать путь непосредственно в CreateProcessByUser, вы должны сначала раскрыть все переменные окружения в строке, используя ExpandEnvironmentStringsForUser. Это, например, преобразует: %windir%\explorer.exe в C:\windows\explorer.exe

.

wchar_t szNewCommandLine[MAX_PATH];
if(!::ExpandEnvironmentStringsForUser(hNewToken, tchcmd, szNewCommandLine, MAX_PATH - 1))
{
    DWORD dwExpandEnvLastError = GetLastError();
    //error handling
}   

Дополнительную информацию см. В этом посте по управлению сессиями, Window Station и рабочим столом .

0 голосов
/ 20 февраля 2014

Я столкнулся с подобной проблемой при попытке запустить программу как обычный пользователь из программы установки, запущенной с повышенными привилегиями администратора. После попытки (и неудачной попытки) сделать это с помощью функции CreateProcessAsUser я наткнулся на решение, которое использует ShellExecute из интерфейса IShellDispatch2.

Может использоваться для запуска процесса в качестве текущего интерактивного пользователя. Для полной реализации смотрите здесь: https://code.google.com/p/mulder/source/browse/trunk/Utils/nsis_stdutils/Contrib/StdUtils/ShellExecAsUser.cpp?r=327

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...