模仿标准用户

时间:2010-02-17 15:18:13

标签: c++ windows

我正在尝试使用标准用户令牌升级为我的正在运行的进程。

我正在做的是首先以管理员身份运行主进程,然后我拍摄正在运行的快照:

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,我就打电话给:

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

然后我打电话给:

ImpersonateLoggedOnUser(hPToken);

最后我taskkill explorer.exe和shell再次执行它,但它在管理员权限下运行。

就像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 个答案:

答案 0 :(得分:3)

在使用令牌之前,您是否在令牌上调用了DuplicateTokenEx?你应该。

而不是ImpersonateLoggedOnUser,您可以更轻松地拨打CreateProcessAsUser

修改以匹配您的:

  • 顺便说一句,您的CreateProcessAsUser应该传递CREATE_DEFAULT_ERROR_MODE | CREATE_UNICODE_ENVIRONMENT dwCreationFlags

  • 您还应该对CreateEnvironmentBlock进行错误检查。

  • 您还应该调整desktopwindow station的{​​{3}}。

  • 您应该首先使用ExpandEnvironmentStringsForUser扩展字符串中的所有环境变量,而不是直接在CreateProcessByUser中指定路径。例如,这会将:%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
}   

Ace

答案 1 :(得分:0)

尝试以提升管理员权限启动的安装程序作为标准用户运行程序时遇到类似问题。在使用CreateProcessAsUser函数尝试(并且悲惨地失败)之后,我偶然发现了一个使用来自IShellDispatch2接口的ShellExecute的解决方案。

它可用于以当前交互式用户身份启动流程。有关完整实施,请查看此处 https://code.google.com/p/mulder/source/browse/trunk/Utils/nsis_stdutils/Contrib/StdUtils/ShellExecAsUser.cpp?r=327

希望这有帮助!