c++ - 模拟标准用户

标签 c++ windows

我正在尝试创建一个正在运行的进程,该进程被提升为使用标准用户 token 重新启动资源管理器。

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

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 );

任何想法或建议。

最佳答案

你在打电话吗 DuplicateTokenEx在使用之前在 token 上?你应该。

而不是 ImpersonateLoggedOnUser ,您可以更轻松地调用 CreateProcessAsUser .

编辑以匹配您的:

  • 顺便说一句,您的 CreateProcessAsUser 应该通过:CREATE_DEFAULT_ERROR_MODE | CREATE_UNICODE_ENVIRONMENT 用于 dwCreationFlags

  • 您还应该在检查您的 CreateEnvironmentBlock 时出错。

  • 您还应该调整 Ace 桌面窗口站

  • 与其在 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
}   

For further reading please see this post on Session, Window Station, and Desktop management .

关于c++ - 模拟标准用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2281823/

相关文章:

c++ - 试图访问一个类中另一个类的成员函数

C++ 正确使用 std::set 对象

c++ - 嵌套在类模板中的类的前向声明是否合法?

c# - 阻止进程创建 MessageBox

C++ win 32application : Employee Class array issue

c++ - 移植到windows时程序崩溃

windows - 无法运行 jenkins cli

c++ - 检测模拟键盘/鼠标输入

python - 从python中的网络驱动器号获取完整的计算机名称

C++ 将 boost 多精度 int 转换为 64 位长度十六进制