Recibe notificaciones de inicio y cierre de sesión

Tengo que desarrollar un programa que se ejecute en una PC local como servicio y entregue un par de estados de usuario a un servidor. Al principio tengo que detectar al usuario.inicio de sesión ydesconectarse.

Mi idea fue usar elManagementEventWatcher clase y para consultar laWin32_LogonSession Ser notificado si algo ha cambiado.

Mi primera prueba funciona bien, aquí está la parte del código(Esto se ejecutaría como un hilo de un servicio):

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

Pero tengo algunos problemas de comprensión y no estoy seguro de si esta es la forma común de resolver esa tarea.

Si preguntoWin32_LogonSession Obtengo varios registros que están asociados al mismo usuario. Por ejemplo, obtengo estos ID 7580798 y 7580829 y si pregunto

ASOCIADORES DE {Win32_LogonSession.LogonId = X} DONDE ResultClass = Win32_UserAccount

Obtengo el mismo registro para diferentes identificaciones. (Win32_UserAccount.Domain = "PC-Name", Name = "User1")

¿Por qué hay varias sesiones de inicio de sesión con el mismo usuario? ¿Cuál es la forma común de obtener el usuario registrado actual? O mejor, ¿cómo recibir una notificación correcta por el inicio de sesión de un usuario?

Pensé que podría usar de la misma manera con__InstanceDeletionEvent para determinar si un usuario está desconectado. Pero supongo que si se levanta el evento, no puedo consultarWin32_UserAccount para el nombre de usuario después de eso. ¿Estoy en lo cierto?

Estoy en la dirección correcta o hay mejores maneras? ¡Sería genial si pudieras ayudarme!

Editar ¿Es la clase WTSRegisterSessionNotification la forma correcta? No sé si es posible, porque en un servicio no tengo un manejador de ventanas.