Otrzymuj powiadomienia od zalogowania i wylogowania

Muszę opracować program, który działa na lokalnym komputerze jako usługa, dostarczając serwerowi kilka statusu użytkownika. Na początku muszę wykryć użytkownikazalogować się iWyloguj.

Moim pomysłem było użycieManagementEventWatcher klasa i zapytaćWin32_LogonSession być powiadomionym, jeśli coś się zmieniło.

Mój pierwszy test działa dobrze, oto część kodu(To zostanie wykonane jako wątek z usługi):

private readonly static WqlEventQuery qLgi = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), "TargetInstance ISA \"Win32_LogonSession\"");

public EventWatcherUser() {
}

public void DoWork() {
    ManagementEventWatcher eLgiWatcher = new ManagementEventWatcher(EventWatcherUser.qLgi);
    eLgiWatcher.EventArrived += new EventArrivedEventHandler(HandleEvent);
    eLgiWatcher.Start();
}

private void HandleEvent(object sender, EventArrivedEventArgs e)
{
    ManagementBaseObject f = (ManagementBaseObject)e.NewEvent["TargetInstance"];
    using (StreamWriter fs = new StreamWriter("C:\\status.log", true))
    {
        fs.WriteLine(f.Properties["LogonId"].Value);
    }
}

Ale mam pewne problemy ze zrozumieniem i nie jestem pewien, czy jest to powszechny sposób na rozwiązanie tego zadania.

Jeśli zapytamWin32_LogonSession Dostaję kilka rekordów powiązanych z tym samym użytkownikiem. Na przykład otrzymuję te identyfikatory 7580798 i 7580829 i jeśli zapytam

ASSOCIATORS OF {Win32_LogonSession.LogonId = X} WHERE ResultClass = Win32_UserAccount

Otrzymuję ten sam rekord dla różnych identyfikatorów. (Win32_UserAccount.Domain = "PC-Name", Name = "User1")

Dlaczego jest kilka sesji logowania z tym samym użytkownikiem? Jaki jest powszechny sposób na zalogowanie się do bieżącego użytkownika? Lub lepiej, jak poprawnie otrzymywać powiadomienia o logowaniu użytkownika?

Myślałem, że mogę użyć tego samego sposobu__InstanceDeletionEvent aby określić, czy użytkownik się wylogowuje. Ale zgaduję, że jeśli zdarzenie zostanie podniesione, nie mogę zapytaćWin32_UserAccount dla nazwy użytkownika po tym. Mam rację?

Jestem we właściwym kierunku, czy są lepsze sposoby? Byłoby wspaniale, gdybyś mógł mi pomóc!

Edytować Czy klasa WTSRegisterSessionNotification jest prawidłowa? Nie wiem, czy to możliwe, ponieważ w usłudze nie mam obsługi okna.

questionAnswers(4)

yourAnswerToTheQuestion