c++ - 对于具有 UIAccess ="true"的进程,CreateProcessAsUser 失败并显示 ERROR_ELEVATION_REQUIRED

标签 c++ c winapi service uac

我正在尝试使用以下代码从我的服务应用程序运行用户模式进程(作为本地系统运行。)

用户模式进程的要求是在没有 提升的情况下运行,但在其 list 中有UIAccess="true" 以便能够display top-most windows correctly under Windows 8 .

所以我这样做(通过我的服务)来运行我的用户模式进程:

//NOTE: Error checking is omitted for readability
//'dwSessionID' = user session ID to run user-mode process in
//'pUserProcPath' = L"C:\\Program Files (x86)\\Company\\Software\\user_process.exe"

HANDLE hToken = NULL;
WTSQueryUserToken(dwSessionID, &hToken);

HANDLE hToken2;
DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hToken2);

LPVOID pEnvBlock = NULL;
CreateEnvironmentBlock(&pEnvBlock, hToken2, FALSE);

STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = L"winsta0\\default";

PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));

//ImpersonateLoggedOnUser(hToken2);   //Not necessary as suggested below

PVOID OldRedir;
Wow64DisableWow64FsRedirection(&OldRedir);

BOOL bSuccess = CreateProcessAsUser(
    hToken2,           // client's access token
    pUserProcPath,     // file to execute
    NULL,              // command line
    NULL,              // pointer to process SECURITY_ATTRIBUTES
    NULL,              // pointer to thread SECURITY_ATTRIBUTES
    FALSE,             // handles are not inheritable
    NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT,   // creation flags
    pEnvBlock,         // pointer to new environment block 
    NULL,              // name of current directory 
    &si,               // pointer to STARTUPINFO structure
    &pi                // receives information about new process
    );

int nOSError = ::GetLastError();

Wow64RevertWow64FsRedirection(OldRedir);
//RevertToSelf();       //Not necessary as suggested below

CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
DestroyEnvironmentBlock(pEnvBlock);
CloseHandle(hToken2);
CloseHandle(hToken);

这运行正常,如果 UIAccess="false"user_process.exe 的 list 中。

但如果我执行以下操作:

  • user_process.exe 启用 UIAccess="true":

enter image description here

  • 使用我的代码签名证书对其进行签名

  • 将其放在 "C:\Program Files (x86)\Company\Software" 文件夹中。

我得到的是 CreateProcessAsUser 失败并出现错误 ERROR_ELEVATION_REQUIRED

有人可以建议如何让它发挥作用吗?

附言。我尝试调整我的服务权限以启用 SE_DEBUG_NAMESE_TCB_NAME,但均无济于事。

PS2。如果我简单地双击使用 UIAccess="true" 编译的 user_process.exe 进程,进行代码签名,并将其放置在 C:\Program Files ( x86)\Company\Software 文件夹,它可以正常启动和运行(未提升。)。

最佳答案

我找到了答案。这也适用于遇到它的任何人:

DuplicateTokenEx 调用之后添加:

HANDLE hToken2;
DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hToken2);

//ONLY if requiring UIAccess!
DWORD dwUIAccess = 1;
::SetTokenInformation(hToken2, TokenUIAccess, &dwUIAccess, sizeof(dwUIAccess));

关于c++ - 对于具有 UIAccess ="true"的进程,CreateProcessAsUser 失败并显示 ERROR_ELEVATION_REQUIRED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23209760/

相关文章:

c++ - (如何)我可以在 Windows 上模拟触摸事件吗?

c - C代码获取Lua中加载的变量列表

检查二维数组元素的相邻元素,而无需多次遍历一个元素

winapi - 以编程方式刷新 IconCache.db

c++ - 强制 Cmake & Emscripten 使用 VS 2010 编译

c++ - 递归函数中的for循环在递归结束后继续

c++ - 如果用新版本覆盖共享库(当前由程序映射)会发生什么?

c++ - 如何写入为结构保留的内存位置

c++,位图不会显示?

c++ - 将 win32_logicaldisk 映射到 win32_diskdrive?