我正在尝试使用以下代码从我的服务应用程序运行用户模式进程(作为本地系统
运行。)
用户模式进程的要求是在没有 提升的情况下运行,但在其 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"
:
使用我的代码签名证书对其进行签名
将其放在
"C:\Program Files (x86)\Company\Software"
文件夹中。
我得到的是 CreateProcessAsUser
失败并出现错误 ERROR_ELEVATION_REQUIRED
。
有人可以建议如何让它发挥作用吗?
附言。我尝试调整我的服务权限以启用 SE_DEBUG_NAME
和 SE_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/