Seja notificado de logon e logoff

Eu tenho que desenvolver um programa que executa em um PC local como um serviço e entregar um par de status de usuário para um servidor. No começo eu tenho que detectar o usuáriologon esair.

Minha ideia era usar oManagementEventWatcher classe e para consultar oWin32_LogonSession para ser notificado se algo mudou.

Meu primeiro teste funciona bem, aqui está a parte do código(Isso seria executado como um segmento de um serviço):

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

Mas tenho alguns problemas de compreensão e não tenho certeza se essa é a maneira comum de resolver essa tarefa.

Se eu consultarWin32_LogonSession Eu recebo vários registros que estão associados ao mesmo usuário. Por exemplo eu recebo este IDs 7580798 e 7580829 e se eu consultar

ASSOCIADORES DE {Win32_LogonSession.LogonId = X} WHERE ResultClass = Win32_UserAccount

Eu recebo o mesmo registro para IDs diferentes. (Win32_UserAccount.Domain = "PC-Name", Name = "User1")

Por que existem várias sessões de logon com o mesmo usuário? Qual é a maneira comum de obter o atual usuário conectado? Ou melhor como ser notificado corretamente pelo login de um usuário?

Eu pensei que eu poderia usar da mesma maneira com__InstanceDeletionEvent para determinar se um usuário está logoff. Mas eu acho que se o evento for gerado, eu não posso consultarWin32_UserAccount para o nome de usuário depois disso. Eu estou certo?

Eu estou na direção certa ou existem maneiras melhores? Seria ótimo se você pudesse me ajudar!

Editar A classe WTSRegisterSessionNotification é a maneira correta? Eu não sei se é possível, porque em um serviço eu não tenho um manipulador de janela.

questionAnswers(4)

yourAnswerToTheQuestion