我正在编写一个服务应用程序,它需要枚举所有当前用户会话,并获取他们的会话 ID,然后查看哪些进程正在为哪些会话运行。我正在使用WTSEnumerateSessions()
API,以及WTSQuerySessionInformation()
获取会话特定信息。不幸的是,那些 WTS API 非常不可靠。
在关闭快速用户切换的 Windows XP 机器上,或在加入域的 XP 机器上,这些 API 不会立即可用。RPC_S_INVALID_BINDING
在 Windows XP 启动并且我的服务启动后的几分钟内,它们可能会失败并显示错误代码或 1702。
我找不到任何官方文档来解释如何处理这种限制。通过搜索引擎可用的方法是等待终端服务服务加载,这当然是可能的,但在 a** 实施中成为主要的痛点。
因此,如果有人可以回答以下问题,我将不胜感激:
- 是否有任何替代 API 可以处理特定于会话的数据,比那些 WTS 更可靠?我主要需要查看机器上的当前会话,获取用户名和会话状态。还要为每个进程枚举具有会话 ID 的进程。(我知道这是可能的,因为 GINA 或登录屏幕可以在终端服务加载之前完成所有这些操作。)
- 在我的服务在任何版本的 Windows Vista/Windows 7 机器上启动之前
WTSEnumerateSessions()
,是否 100% 保证 WTS 类 API(例如WTSQuerySessionInformation()
和WTSEnumerateProcesses()
)会加载?
请注意bofore和任何非常重要的规定。