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.