Cómo averiguar si un usuario está actualmente "logueado" en el sistema

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 «josecoreduojose» 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!

Windows Vista con 108 aplicaciones abiertas

Leo en Engadget esto y la verdad es que me llama la atención el experimento:



«Habíamos visto esas fotos de un MacBook Pro corriendo 150 aplicaciones en Mac OS X, pero con esto demostramos que Windows no se queda atrás… (aunque sí se queda atrás, porque son sólo 108 aplicaciones). Según vemos en el video (después del salto), el ordenador que usan debe ser muy bueno (sabemos que tiene 3,25GB de RAM), porque aún con todas esas aplicaciones, la velocidad sigue siendo aceptable.»



Interesante…