我正在尝试从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);