【问题标题】:WTSEnumerateProcesses and Terminal Services ServiceWTSEnumerateProcesses 和终端服务服务
【发布时间】:2012-07-12 13:50:40
【问题描述】:

我的Windows服务在调用WTSEnumerateProcesses()时偶尔会报如下错误:

绑定句柄无效。

我怀疑这是由于终端服务服务不可用造成的,即使我已将终端服务服务注册为我的服务的依赖服务。

我相信即使终端服务服务正在运行,它还没有完成初始化(或正在关闭)并且无法为任何请求提供服务,从而导致错误。

我在WTSRegisterSessionNotification() 的参考文档中注意到以下内容:

当设置了Global\TermSrvReadyEvent全局事件后,所有依赖的服务都已启动,可以成功调用该函数。

这没有出现在WTSEnumerateProcesses() 的文档中,但它是否同样适用?意思是在Global\\TermSrvReadyEvent 上尝试OpenEvent() 将表明终端服务服务实际上可用?


平台:Windows XP、Windows Vista 和 Windows 7

【问题讨论】:

  • 这个假设似乎是合理的,但您可能仍然应该等待事件的正确性,而不仅仅是检查它是否存在。
  • @0xC0000022L,是的,这就是我的意思。听起来好像是我,但我只是想确定一下。
  • @hmjd:只是好奇你是否曾在 XP 以外的操作系统上观察到这一点?在我的测试中,我只能在大多数 WTS* API 中在 Windows XP 上启动后立即看到此错误。这似乎已在 Vista 和更高版本的操作系统下得到修复。
  • @0xC0000022L:我的经验表明,依赖Global\TermSrvReadyEvent 事件导致的问题多于解决的问题。例如,如果您的流程在非管理员用户帐户下运行,您将无法打开该事件,这会产生额外的歧义。在我的测试中,最可靠的方法是在 WTS* API 失败后检查GetLastError,看看它是否是RPC_S_INVALID_BINDING,如果是,请等待一小段时间并再次重复调用(前提是没有超时)过期了。)也就是说,我很头疼!

标签: windows winapi


【解决方案1】:

你肯定想OpenEvent(SYNCHRONIZE, false, L"Global\\TermSrvReadyEvent") 等待它。

所有WTS* 函数通过 C API (see the runtime interface protocol) 底层的 RPC 调用终端服务服务(现在称为远程桌面服务服务)。

与 c00000fd 的经历相反,我从未在 Windows 7 及更高版本上遇到标准用户帐户和事件对象的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多