1

我需要 C++ 代码在从管理员进程调用时注销控制台用户的能力,或者如果它被该用户调用,并且将来可能是 Windows 服务。我遇到的问题是 ExitWindowsEx 只会注销调用它的用户。如果管理员进程调用注销,则控制台用户不受影响。我所知道的唯一可以执行此操作的应用程序是 psShutdown.exe,除了 psShutdown 只能由管理员运行。有谁知道在 C++ 中如何识别控制台用户,然后对该用户进行注销?psShutdown 里面有什么魔力?我正在寻找适用于 WindowsXP 及更高版本的东西。我也不能使用 WMI,因为有些机器正在运行 windows Embeded 并且没有 WMI。

(psShutdown.exe 必须以管理员身份运行的原因是因为它安装了一项服务,而普通用户无权执行此操作。)

4

2 回答 2

1

我实际上从未这样做过,但似乎应该可以结合WTSGetActiveConsoleSessionId()WTSLogoffSession()

于 2011-03-01T22:03:42.040 回答
1

使用WTSGetActiveConsoleSessionId来识别控制台会话,但要更进一步,您将需要一些权限,您必须调用 WTSQueryUserToken(您需要以 SYSTEM 身份运行才能执行此操作)以获取令牌句柄,然后 CreateProcessAsUser 或模拟并调用 ExitWindowsEx ,或者如果您不在服务中,请调用 WTSLogoffSession。(我尝试在我的 XP 机器上调用 WTSLogoffSession,但没有成功,可能是因为该系统上没有运行终端服务器服务)

于 2011-03-01T22:07:06.447 回答