代码之家  ›  专栏  ›  技术社区  ›  Zaid Amir

模拟标准用户

  •  4
  • Zaid Amir  · 技术社区  · 16 年前

    我正在尝试使我的运行进程被提升为使用标准用户令牌重新启动资源管理器。

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

    然后,当我得到在标准用户帐户下运行的explorer的PID时,我调用:

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

    然后我打电话给:

    ImpersonateLoggedOnUser(hPToken);
    

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

    就好像impersonateLoggedonUser不工作一样。尽管返回true和GetLastError()返回0;

        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 回复  |  直到 16 年前
        1
  •  3
  •   Brian R. Bondy    15 年前

    你在打电话吗 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
    }   
    

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

        2
  •  0
  •   Marko Popovic    12 年前

    当我试图以标准用户的身份从一个以提升的管理权限启动的安装程序运行程序时,我遇到了类似的问题。在尝试使用CreateProcessAsUser函数(但失败得很惨)完成此操作后,我偶然发现了一个使用来自IShellDispatch2接口的ShellExecute的解决方案。

    它可用于以当前交互用户身份启动进程。要获得完整的实现,请查看以下内容: https://code.google.com/p/mulder/source/browse/trunk/Utils/nsis_stdutils/Contrib/StdUtils/ShellExecAsUser.cpp?r=327

    希望这有帮助!