c++ - Win7 C++ - 从以用户身份登录的服务中以用户身份启动可执行文件
问题描述
我正在解决一个 Windows 服务的问题,到目前为止,它在模拟当前用户并在该用户的会话中启动可执行文件时没有问题。
我最初的问题是我无法访问有关已安装驱动器或其上文件的信息。所以我发现我需要定义服务以用户身份登录。
一旦我这样做了,我就不再有访问这些文件的问题,但是启动可执行文件的模拟不再起作用。或者更具体地说,我的调用WTSQueryUserToken()
不再有效,而是返回 false,并GetLastError()
返回 ERROR_PRIVILEGE_NOT_HELD。
我还不知道我是否会遇到DuplicateTokenEx()
or的任何问题CreateProcessAsUserA()
,但一次一件事。
我的代码如下(在此之前检索到dwSessId并且是正确的):
if (dwSessId >= 0)
{
HANDLE hCurrentToken;
HANDLE hPrimaryToken;
BOOL ok = WTSQueryUserToken(dwSessId, &hCurrentToken);
if (ok)
{
ok = DuplicateTokenEx(hCurrentToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, 0, SecurityImpersonation, TokenPrimary, &hPrimaryToken);
// now we start the executable process as the current user
STARTUPINFOA si;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
ret = (CreateProcessAsUserA(hPrimaryToken, procname.c_str(), NULL, 0, 0, false, CREATE_NO_WINDOW, 0, 0, &si, &m_pProcInfo) != 0);
}
}
else
{
int err = GetLastError();
return false;
}
解决方案
根据WTSQueryUserToken()
文档:
要成功调用此函数,调用应用程序必须在
LocalSystem
帐户的上下文中运行并具有SE_TCB_NAME
权限。
换句话说,您不能将服务配置为以任何特定用户身份运行。但是,它当然可以在需要时模拟用户,只要调用的线程在调用WTSQueryUserToken()
时没有模拟用户。
推荐阅读
- javascript - 如何在 react-redux 中更改初始状态
- dart - 如何在 Dart 中编写二进制文字
- mysql - 子查询选择内部 where 子句的外部值
- c# - 阻止 BroadcastBlock 在 LinkTo 上发送缓冲消息
- python - Python:即使检测到设备,也无法使用 PyBluez 扫描连接到蓝牙设备所需的信息
- c# - 找不到类型或命名空间名称“DefaultHttpRequest”
- vue.js - Vuex:如何用 Vuex 替换父子之间的函数发射?
- python - 矩阵创建和赋值 Python
- flutter - 颤动动态文本方向性问题
- jquery - 我想在 cartDetails() 中使用“this”,但显示 Uncaught TypeError