ImpersonateLoggedOnUser在windows服务中不工作
ImpersonateLoggedOnUser not working in windows service
我正试图从一个windows服务(以SYSTEM运行(中调用一个windows api(它似乎只在登录用户的上下文中工作(。我可以为登录用户获取令牌。当我调用ImpersonateLoggedOnUser((时,我没有得到任何错误,它返回true。但是DoSomethingInUserContext((仍然在SYSTEM上下文中执行。我做错了什么?
DWORD sessionIdDw = WTSGetActiveConsoleSessionId();
HANDLE hToken;
if (!WTSQueryUserToken(sessionIdDw, &hToken))
LOG() << "WTSQueryUserToken failed: " << GetLastError();
HANDLE hDuplicated = NULL;
if (!DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenImpersonation, &hDuplicated)) {
LOG() << "DuplicateTokenEx failed: " <<GetLastError();
}
if (!ImpersonateLoggedOnUser(hDuplicated)) {
LOG() << "ImpersonateLoggedOnUser failed " << GetLastError();
}
else {
DoSomethingInUserContext();
if (!RevertToSelf()) {
LOG() << "RevertToSelf failed" << GetLastError();
}
}
CloseHandle(hDuplicated);
CloseHandle(hToken);
注释足够详细,可以指出原因,EnumWindows
按会话枚举。
创建用户服务是一种可行的方法。以下方法也是有效的:
TCHAR Command[MAX_PATH] = L"C:\EnumWindows.exe";
DWORD sessionIdDw = WTSGetActiveConsoleSessionId();
logfile(sessionIdDw);
HANDLE hToken;
if (!WTSQueryUserToken(sessionIdDw, &hToken))
LOG() << "WTSQueryUserToken failed: " << GetLastError();
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&pi, sizeof(pi));
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
if(!CreateProcessAsUser(hToken,NULL,Command,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
LOG() << "CreateProcessAsUser failed: " << GetLastError();
else
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
新进程正在用户会话中运行。
编辑:
感谢@Eryk指出,窗口站:
每个会话都与自己的交互式窗口站相关联
SetThreadDesktop
:
桌面必须与过程
SetProcessWindowStation
:
窗口工作站必须与当前会话相关联。
所以SetThreadDesktop
在这里不起作用。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 名为DLL的C++windows服务程序工作不正常
- ImpersonateLoggedOnUser在windows服务中不工作
- 最小工作示例张量流服务客户端
- 从Windows上的系统工作的服务中获取用户文档文件夹.C++
- C++如何在工作和过程中停止服务
- .vbs文件在windows服务中无法正常工作