Lassen Sie sich von An- und Abmeldung benachrichtigen

Ich muss ein Programm entwickeln, das auf einem lokalen PC als Dienst läuft und ein paar Benutzerstatus an einen Server liefert. Zu Beginn muss ich den Benutzer erkennenEinloggen undabmelden.

Meine Idee war, das zu benutzenManagementEventWatcher Klasse und die abzufragenWin32_LogonSession benachrichtigt zu werden, wenn sich etwas ändert.

Mein erster Test funktioniert gut, hier ist der Codeteil(Dies würde als Thread von einem Dienst ausgeführt):

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);
    }
}

Ich habe jedoch einige Verständnisprobleme und bin mir nicht sicher, ob dies der übliche Weg ist, um diese Aufgabe zu lösen.

Wenn ich frageWin32_LogonSession Ich erhalte mehrere Datensätze, die demselben Benutzer zugeordnet sind. Zum Beispiel bekomme ich diese IDs 7580798 und 7580829 und wenn ich frage

ASSOCIATOREN VON {Win32_LogonSession.LogonId = X} WHERE ResultClass = Win32_UserAccount

Ich erhalte den gleichen Datensatz für verschiedene IDs. (Win32_UserAccount.Domain = "PC-Name", Name = "User1")

Warum gibt es mehrere Anmeldesitzungen mit demselben Benutzer? Was ist der übliche Weg, um den aktuell angemeldeten Benutzer zu erhalten? Oder besser, wie man sich durch das Login eines Nutzers richtig benachrichtigen lässt?

Ich dachte, ich könnte den gleichen Weg mit verwenden__InstanceDeletionEvent um festzustellen, ob ein Benutzer abgemeldet ist. Aber ich denke, wenn das Ereignis ausgelöst wird, kann ich nicht abfragenWin32_UserAccount für den Benutzernamen danach. Ich habe recht?

Ich bin in der richtigen Richtung oder gibt es bessere Möglichkeiten? Es wäre großartig, wenn Sie mir helfen könnten!

Bearbeiten Ist die WTSRegisterSessionNotification-Klasse der richtige Weg? Ich weiß nicht, ob es möglich ist, weil ich in einem Dienst keinen Fensterheber habe.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage