Los sistemas Windows actuales son capaces de gestionar varias sesiones de trabajo simultáneas, para diferentes usuarios. Windows Xp o Vista sólo permiten una sesión interactiva al mismo tiempo pero es una simple cuestión de licencia, ya que en realidad internamente las gestionan de ese modo (de hecho existen programas en el mercado que desbloquean esta limitación). En Windows Server con terminal Services o en modo administrativo esto ya no es una limitación y se pueden tener tantas sesiones de usuario interactivas abiertas como soporte el hardware.

Puede que a nuestro programa le venga bien saber en un momento dado si un determinado usuario está con una sesión iniciada o no. O incluso obtener una lista de usuarios que están actualmente en el sistema.

La forma de conseguirlo es mediante una consulta WMI (Windows Management Instrumentation). En el siguiente fragmento se ve un método que, dado un nombre de dominio y un nombre de usuario comprueba si éste está "logueado" actualmente en el sistema:

    private static bool IsUserLoggedOn(string sDominio, string sNomUsuario)
    {
        string _dominio = "";
        string _usuario = "";
    
        ObjectQuery oQuery = new ObjectQuery("select * from win32_computersystem");
    
        ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oQuery);
    
        ManagementObjectCollection oReturnCollection = oSearcher.Get();
        if (oReturnCollection.Count >= 1)
        {
            foreach (ManagementObject oReturn in oReturnCollection)
            {
                string nombre = oReturn["UserName"].ToString();
                if (nombre.Length > 0)
                {
                    int index = nombre.IndexOf('\\');
                    _dominio = nombre.Substring(0, index).ToLower();
                    _usuario = nombre.Substring(index + 1).ToLower();
                    
                    if (sDominio.ToLower() == _dominio.ToLower() && sNomUsuario.ToLower() == _usuario.ToLower() )
                    return true;
                }
            } 
        }
        return false;
    }

Para ello se usa la clase ObjectQuery, que sirve para definir consultas WMI, y la clase ManagementObjectSearcher, que es la encargada de realizar la consulta. Ambas están en el espacio de nombres System.Management.

Ahora podemos escribir por ejemplo:

Console.WriteLine(IsUserLoggedOn("Josecoreduo", "jose"));
Console.ReadLine();

Para averiguar si el usuario "josecoreduo\jose" está actualmente autenticado en el sistema.

La consulta lanzada en realidad nos permite obtener muchísima otra información sobre el equipo de modo similar al visto, a través de los miembros de la clase Win32_ComputerSystem, incluso de equipos remotos sobre los que tengamos permisos.

Espero que os resulte útil!

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA