【问题标题】:How to capture logoff cancelled in windows server 2003如何捕获在 Windows Server 2003 中取消的注销
【发布时间】:2013-04-25 08:45:53
【问题描述】:

我正在开发一个在 Windows 2003 上运行的基于终端服务的系统。它由一个桌面替换应用程序组成,用户可以从该应用程序启动程序。它还有一个注销按钮。当用户注销时,必须发生两件事。首先,他从 Windows 中注销。然后调用存储过程清理用户数据库状态。这几乎可以正常工作,但在一种情况下,即用户取消注销事件时。典型场景: 1- 用户登录,启动 MS Word,编辑文档,不保存。 2 - 然后用户按下注销按钮。 3- MS Word 对此做出反应,要求用户保存他的更改。 4 - 用户按下取消。

此时桌面应用程序可能已经调用存储过程清理数据库状态。如何在桌面应用程序中捕捉到这种行为?是否有消息说结束会话操作已取消?

我的问题有意义吗?

哦,所有的应用程序都是用 Delphi 7 编写的,但我也使用 C、C++ 和 C# 工作,因此也欢迎使用这些语言的答案。

【问题讨论】:

  • 您可以在那台机器上运行服务吗? ...另外,您是否尝试过使用基于 grouppolicy 的注销脚本来启动您的存储过程?
  • 我认为您应该尝试检测实际注销并假设取消:当WM_QUERYENDSESSION 消息发送到 Word 时会发生 Word-cancel;如果注销被取消,系统将永远不会发送WM_ENDSESSION消息。
  • @Medinoc:MSDN 文档指出:“当应用程序为 WM_QUERYENDSESSION 返回 TRUE 时,它会收到 WM_ENDSESSION 消息并终止,无论其他应用程序如何响应 WM_QUERYENDSESSION 消息。”这意味着我的桌面替换应用程序将收到 WM_ENDSESSION,即使它在 word 中被取消。
  • @DarkSquirrel42:是的,我可以在机器上实现和运行服务。运行注销脚本可能不是一个坏主意。但这并不能解决问题,因为如果用户通过例如 word 取消注销过程,我仍然需要启动并运行桌面替换。
  • 在这种情况下,我要么选择使用注销脚本开始清理,要么运行一个服务来暂停你的 shell 进程并监听 shell 的终止(到目前为止据我所知,shell 是会话结束时将被终止的最后一个进程...)

标签: c# c++ c windows delphi


【解决方案1】:

如果您的用户状态逻辑在您的外壳替换中,那么请考虑重新设计应用程序:将自定义外壳与会话管理分离。

例如:在服务中移动您的用户状态逻辑。在 RDS 通知的此服务注册中:WTS_SESSION_LOGON/WTS_SESSION_LOGOFF。

我认为 WTS_SESSION_LOGOFF 仅在实际注销发生时发送 ,即如果用户单击 Word 中的“取消”按钮,那么 Windows 将知道用户实际上并未注销并且操作系统不会发送 WTS_SESSION_LOGOFF(此未经测试,但听起来合乎逻辑)。

这样你就不用处理 WM_ENDSESSION/WM_QUERYENDSESSION 的东西了。

Recently I wrote some guidance on RDS notifications topic.

【讨论】:

  • 如果用户发起注销但被取消,这仍然会留下保留我的桌面替换的问题。替换的不是一个合适的外壳,而只是一个图形界面,它作为 Citrix 中的第一个应用程序启动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
相关资源
最近更新 更多