ImpersonateLoggedOnUser在Windows服务中不起作用

问题描述 投票:0回答:1

我正在尝试从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);
c++ windows winapi impersonation
1个回答
0
投票

注释足够详细,可以指出原因,EnumWindows按会话枚举。

而且我已经测试了函数EnumWindows来设置线程的上下文桌面。桌面确实发生了变化,但是SetThreadDesktop仍然无法正常工作:(删除错误检查)

SetThreadDesktop

创建用户服务是一种可行的方法。并且以下方法也有效:

EnumWindows

新进程正在用户会话中运行。

© www.soinside.com 2019 - 2024. All rights reserved.