C# 如何检测用户';的会话已完成注销

C# 如何检测用户';的会话已完成注销,c#,session,service,user-profile,C#,Session,Service,User Profile,我有一个Windows服务,它通过重写ServiceBase对象成功地检测到SessionLogon和SessionLogoff(以及大多数其他服务)。这很有效。但是,这些事件似乎是在身份验证之后以及用户单击注销按钮(或某些自动过程注销用户)之后立即触发的。除了知道用户何时开始登录和何时开始注销之外,我还需要知道用户何时完成登录和注销。目前,我希望用户的shell进程开始执行(通常是explorer.exe)以进行登录,并且在大多数情况下运行良好。当他们的shell启动时,如果他们正在使用漫游配

我有一个Windows服务,它通过重写ServiceBase对象成功地检测到SessionLogon和SessionLogoff(以及大多数其他服务)。这很有效。但是,这些事件似乎是在身份验证之后以及用户单击注销按钮(或某些自动过程注销用户)之后立即触发的。除了知道用户何时开始登录和何时开始注销之外,我还需要知道用户何时完成登录和注销。目前,我希望用户的shell进程开始执行(通常是explorer.exe)以进行登录,并且在大多数情况下运行良好。当他们的shell启动时,如果他们正在使用漫游配置文件或其他正在进行的登录操作,我几乎可以肯定,当shell运行时,大部分的登录过程已经发生

然而,对于注销,这并没有被证明是可靠的。我正在寻找一种方法来准确地检测用户的注销何时完成,包括他们的所有配置文件信息何时完成同步或复制,以及是否发生了任何其他注销操作。仅仅看着他们的shell程序结束似乎是不够的,因为注销可能需要几秒钟到几分钟的时间(比如说如果他们有漫游配置文件)

因此,简而言之,我正在寻找一种C#中的编程方式,以检测何时发生完全注销以及所有配置文件同步,或者在SessionLogoff事件触发后您完成了什么。

我已经到处找了,但没有看到任何人谈论事件发生时间和实际注销结束时间之间的时间差


注意:我也不能依赖断开事件,因为用户可能在注销后但在其配置文件完成同步/复制您拥有的内容之前断开连接。我正在寻找一种方法来检测(在它发生的几秒钟内)已完成的注销。

您是否尝试过收听


检查是否存在。注销。

是。正如我在开始时所说的,我已经成功地检测到SessionLogoff。但是,只要用户单击“注销”按钮,就会出现这种情况。然后,在该事件之后的一段时间内,将执行操作,例如将配置文件同步到服务器,这可能需要几秒钟到几分钟的时间。我想要一种方法来检测注销过程何时结束(在配置文件复制等之后)。是的,我在你的问题中读到了。您说过您正在通过覆盖ServiceBase对象检测SessionLogoff。SystemEvents有两个事件。
SessionEnding
上的文档说“当用户试图注销或关闭系统时发生”。这听起来像是选择了注销按钮
SessionEnded
表示“在用户注销或关闭系统时发生”。这听起来像是注销后事件。这就是我为什么建议它的原因。可能您已经尝试过了,但听起来像是您需要的。SessionEnding让您有机会在用户单击“注销”按钮后但在SessionLogoff之前取消注销操作。如果没有进程以Cancel==true响应SessionEnding,则会触发SessionLogoff。可以认为这两个事件都发生在注销操作开始时。我要寻找的是另一个事件或方法,以准确地确定注销和任何其他注销操作(特别是配置文件同步)已完成。