Windows .NET Service – L’événement OnSessionChange semble peu fiable

J’écris un service Windows en C # qui doit garder la trace de l’utilisateur actuellement connecté. Pour ce faire, j’ai remplacé l’événement OnSessionChange afin de savoir quand les utilisateurs se connectent, se déconnectent ou verrouille l’ordinateur. Cela fonctionne généralement, la plupart du temps, mais parfois le service perd la trace de l’utilisateur actif. Dans mes fichiers journaux, je peux voir que le problème est la méthode OnSessionChange. Je génère des informations de journal chaque fois que cette fonction est appelée, et apparemment, les appels OnSessionChange sont parfois dans le mauvais ordre. Autrement dit, si un utilisateur verrouille l’ordinateur puis se connecte à nouveau rapidement, il arrive parfois que les deux appels OnSessionChange provoquent un appel incorrect (par exemple, un événement de délocking, puis un événement de locking).

Est-ce que quelqu’un sait pourquoi cela se produit? Et existe-t-il une solution de contournement pour ce problème?

Edit: Voici un exemple de code pour le rendre un peu plus clair (espérons-le):

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(Ssortingng.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(Ssortingng.Format("{0} unlocked at {1}\r\n", user, DateTime.Now)); base.OnSessionChange(changeDescription); } catch (Exception e) { LogText("Exception: " + e); } } 

(les fonctions _getUserName et LogText ne sont pas affichées, mais elles font ce que leurs noms suggèrent. Aussi, je ne reçois jamais d’exceptions, donc le bloc try-catch-block est juste là pour vérifier que je n’en ai aucun.)

Maintenant, parfois, dans mon journal, je reçois des choses comme ceci:

 UserA débloqué au 18.01.2015 08:40:29
 UserA débloqué au 18.01.2015 08:44:28
 UtilisateurA verrouillé à 18.01.2015 08:44:28

C’est ce qui s’est passé ce matin. L’utilisateur est connecté, puis verrouillé et immédiatement (je pense) connecté à nouveau. Mais les deux derniers événements ont été déclenchés dans le mauvais ordre, alors après cette séquence, mon service mistekenlyly pensé que UserA était parti.

Souvent, je reçois plusieurs événements de délocking à la suite, comme celui-ci d’hier:

 UtilisateurA débloqué au 17.01.2015 10:55:26
 UtilisateurA débloqué au 17.01.2015 10:55:26
 UserA débloqué au 17.01.2015 10:56:33

Ou je peux avoir plusieurs événements de locking dans une rangée, ce qui signifie probablement que je manque un ou plusieurs événements de délocking entre eux:

 UtilisateurA débloqué le 17.01.2015 09:29:35
 UtilisateurA verrouillé au 17.01.2015 10:25:28
 UtilisateurA verrouillé au 17.01.2015 10:30:20

this.CanHandleSessionChangeEvent doit être défini sur true, la valeur par défaut est false.