1

在 Microsoft 网站上(请参阅msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx),它清楚地表明“服务无法直接与 Windows Vista 中的用户交互”。

所以我决定使用“psexec -s cmd.exe”来测试它。据我所知,“psexec”会创建一个服务以打开命令提示符。不用说它奏效了。然后我决定将“EnumWinSta GUI”与 psexec 结合使用来切换到 winlogon 桌面。令我惊讶的是,我什至可以在这个桌面上启动“cmd.exe”。这是否意味着从服务创建的新流程可以是交互式的?

还是因为 psexec 做了某种黑魔法?如果是这样,它是如何做到的?

我正在尝试将服务中的全屏窗口显示到 Vista 和 XP 中的 winlogon 桌面对象中。

4

1 回答 1

3

在服务中运行的代码不能直接与交互式会话进行交互。

但是,作为具有足够权限的服务运行的代码可以创建一个在特定用户桌面内运行的新进程——例如,获取交互式会话的用户令牌并调用 CreateProcessAsUser。

您可以使用 WTSGetActiveConsoleSessionId 获取活动控制台会话,即实际在机器上的用户的会话。然后可以使用 WTSQueryUserToken 来获取令牌。

您的服务还可以在其处理函数中使用会话更改通知来查看用户何时登录/注销、解锁他们的会话等。

于 2009-05-20T19:58:22.600 回答