C# 会话更改有时不起作用

C# 会话更改有时不起作用,c#,login,windows-services,C#,Login,Windows Services,我有一个windows服务,它应该检查所有用户的登录和注销,并将他们全部插入一个表中。我在服务中使用了OnSessionChange()和OnShutDown()事件来完成这项工作。它有时工作正常,但有时当用户登录或关闭时不会发生任何错误,我认为有时这些事件不会触发 我不知道我的错在哪里 编辑: 我想创建一个winservice来保存域中所有帐户的登录和注销时间。 我尝试了OnSessionChange()并签出了SessionChangeDescription属性,但它有时无法正常工作,因此我

我有一个windows服务,它应该检查所有用户的登录和注销,并将他们全部插入一个表中。我在服务中使用了OnSessionChange()和OnShutDown()事件来完成这项工作。它有时工作正常,但有时当用户登录或关闭时不会发生任何错误,我认为有时这些事件不会触发

我不知道我的错在哪里

编辑:

我想创建一个winservice来保存域中所有帐户的登录和注销时间。 我尝试了OnSessionChange()并签出了SessionChangeDescription属性,但它有时无法正常工作,因此我决定使用api函数来实现这一点。 为了便于我的搜索,LsaGetLogonSessionData和ISensLogon2函数可能会返回我想要的内容。但问题是我应该在哪里使用这个函数?我应该在事件中调用此函数,还是它可以自行诊断登录和注销

我还在等你的答复。。。。
提前感谢…

登录时,您的服务可能在触发事件之前未启动。 但出于这些原因,注销应该是可行的


您应该首先检查“CanHandleSessionChangeEvent”和“CanHandlePowerPrevent”是否为真。

对于那些无法从SessionChangeDescription.SessionId获取用户名的用户:

有时,在SessionLogoff中,当您需要访问已注销的用户时,注销操作执行得很快,并且SessionId丢失

我的解决办法是:

1.定义全局数组(如
字典用户列表

2.在SessionLogon事件中存储会话id和用户名(如
userlist.Add(SessionChangeDescription.SessionId,GetUsernameBySessionId(SessionChangeDescription.SessionId)

3.按数组访问每个位置的用户名(如
userlist[changescription.SessionId]