【问题标题】:Race condition with WTS_SESSION_LOGON notification带有 WTS_SESSION_LOGON 通知的竞争条件
【发布时间】:2015-05-30 05:58:30
【问题描述】:

在我的 Windows 服务中,我尝试在交互式用户登录系统时执行一些特定操作。为此,我跟踪WTS_SESSION_LOGON 通知。不幸的是,今天我发现该通知带有竞争条件。

例如,如果用户帐户配置了密码,则在系统启动后我的服务启动并且当用户输入他们的密码时,我的服务可以接收WTS_SESSION_LOGON并很好地处理它。

当只有一个用户帐户没有密码时,就会出现此问题。启动后,系统会自动登录该用户,但我的服务可能会稍后启动,因此它不会收到任何交互式用户登录的通知。

知道有没有办法解决这个问题?或者至少告诉用户会话会自动登录?

PS。 WTS_CONSOLE_CONNECT 通知也会发生相同的竞争条件。

【问题讨论】:

    标签: windows winapi terminal-services


    【解决方案1】:

    当您的服务启动时,它可以使用WTSEnumerateSessions() 找出哪些会话已经存在以及它们的当前状态是什么(连接、活动/登录等),然后再处理其@ 中的后续WTS_SESSION_CHANGE 通知987654323@回调。

    【讨论】:

    • 谢谢。但是,当有人停止然后在服务管理器中启动我的服务时,我将如何区分它呢?即使交互式用户可能在几天前​​登录,它也会产生相同的结果。
    • 真的很重要吗?当您的服务启动时,它可以查看用户是否已经登录,如果已经登录,则执行它需要做的事情,就像它收到了WTS_SESSION_LOGON 一样。如果您必须仅在新会话开始时执行操作,并且担心您的服务启动太晚,请将其配置为尽早启动。
    • 顺便说一句,还有另一个更糟糕的竞争条件 - 如果您在收到 SERVICE_CONTROL_SESSIONCHANGE 事件后立即执行 WTSEnumerateSessions,您通常不会看到事件数据所指的新会话。如果你睡了 10-100 毫秒,然后重新执行 WTSEnumerateSessions,现在它就会出现。很烦人
    • 另一个有趣的事实:WTS_SESSION_LOGOFF 事件是在会话实际注销之前触发的~嗯~。它基本上是在您单击“注销”后发送的,但会话会在 WTSEnumerateSessions 中持续存在,直到您的所有进程实际终止并且您的会话最终断开连接并退出。这可能长达几分钟,具体取决于您正在运行的内容。
    • @JonMarnock SERVICE_CONTROL_SESSIONCHANGE 告诉您触发事件的会话 ID,因此您无需使用 WTSEnumerateSessions() 寻找它
    猜你喜欢
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2018-10-08
    相关资源
    最近更新 更多