c# - Windows .NET 服务 - OnSessionChange 事件似乎很不可靠

标签 c# windows service authentication

我正在用 C# 编写一个 Windows 服务,它需要跟踪当前事件的登录用户。为此,我覆盖了 OnSessionChange 事件,以便记录用户何时登录、注销或锁定计算机。这通常在大多数情况下都有效,但有时服务会丢失对事件用户的跟踪。在我的日志文件中,我可以看到问题出在 OnSessionChange 方法上。每次调用此函数时,我都会输出一些日志信息,显然,有时 OnSessionChange 调用的顺序错误。也就是说,如果用户锁定计算机然后再次快速登录,有时会发生两次 OnSessionChange 调用,这会导致调用顺序错误(例如,首先是解锁事件,然后是锁定事件)。

有人知道为什么会这样吗?这个问题有什么解决方法吗?

编辑:这里有一些示例代码,让它更清晰一点(希望如此):

protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
    try
    {
        var user = _getUserName(changeDescription.SessionId);

        if (changeDescription.Reason == SessionChangeReason.SessionLock ||
            changeDescription.Reason == SessionChangeReason.SessionLogoff ||
            changeDescription.Reason == SessionChangeReason.ConsoleDisconnect)

            LogText(String.Format("{0} locked at {1}\r\n", user, DateTime.Now));

        else if (changeDescription.Reason == SessionChangeReason.SessionUnlock ||
                 changeDescription.Reason == SessionChangeReason.SessionLogon ||
                 changeDescription.Reason == SessionChangeReason.ConsoleConnect)

            LogText(String.Format("{0} unlocked at {1}\r\n", user, DateTime.Now));

        base.OnSessionChange(changeDescription);
    }
    catch (Exception e)
    {
        LogText("Exception: " + e);
    }
}

(函数 _getUserName 和 LogText 没有显示,但它们的作用与它们的名字所暗示的一样。另外,我从来没有遇到异常,所以 try-catch-block 只是为了验证我实际上没有得到任何异常。)

现在,有时,在我的日志中我会得到这样的东西:

UserA unlocked at 18.01.2015 08:40:29
UserA unlocked at 18.01.2015 08:44:28
UserA locked at 18.01.2015 08:44:28

这是今天早上发生的事情。 UserA 登录,然后锁定并立即(我认为)再次登录。但是最后两个事件以错误的顺序触发,所以在这个序列之后,我的服务错误地认为 UserA 已经消失了。

通常,我会连续遇到几个解锁事件,比如昨天的这个:

UserA unlocked at 17.01.2015 10:55:26
UserA unlocked at 17.01.2015 10:55:26
UserA unlocked at 17.01.2015 10:56:33

或者我可以连续获得多个锁定事件,这可能意味着我在它们之间缺少一个或多个解锁事件:

UserA unlocked at 17.01.2015 09:29:35
UserA locked at 17.01.2015 10:25:28
UserA locked at 17.01.2015 10:30:20

最佳答案

this.CanHandleSessionChangeEvent 必须设置为true,默认值为false。

关于c# - Windows .NET 服务 - OnSessionChange 事件似乎很不可靠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28015074/

相关文章:

c# - 如何使用linq C#展平列表

c# - CaSTLe Windsor自动注册多个接口(interface)及其对应的实现

javascript - 使用 Javascript/Windows 批处理文件混合将非 ASCII 字符编码为 HTML

powershell - 使用Set-Service远程停止和重新启动服务

java - getApplicationContext() 中的空指针

c# - 服务器标记格式不正确错误

c# - 将数据传递给 Vue.js 组件

windows - 将 Linux 目录与 Windows 网络路径同步

c++ - 如何将系统颜色更改为默认颜色?

java - 线程中的服务与服务中的线程