C# Eingeloggte Benutzer ermitteln

raptor trx

Lt. Junior Grade
Registriert
Mai 2006
Beiträge
294
Hi@all,

ich versuche gerade ein Tool zu programmieren welches die Benutzer die gerade an der Domäne angemeldet sind ausliest. Habe es ursprünglich mit dem Auslesen aus dem "Active Directory" probiert, das ermitteln aller Benutzer und deren letzten Loginzeitpunkt(über die LastLogon Eigenschaft) hat wunderbar funktioniert. Ich wollte dann "LastLogon" mit "LastLogoff" vergleichen und so herausfinden ob der Benutzer gerade angemeldet ist, aber ich habe zu spät gesehen das die "LastLogoff" Eigenschaft gar nicht verwendet wird und immer den Wert 0 hat. Somit ist mein Plan natürlich geplatzt, kann mir eventuell jemand weiterhelfen zum gewünschten Ergebnis zu kommen?

Mfg
 
Meistens sagt man, wenn die letzte Aktion maximal 5 Minuten her ist, dann ist der Nutzer auch noch eingeloggt. Das ist die einfachste Möglichkeit.
Steht dir solch eine Information zur Verfügung?
 
Also das ganze ist durchaus möglich, ich weise aber drauf hin das das ganze SUPER langsam und relativ unsicher ist. Das Problem ist, du benötigst einen DOMAIN-Admin User um zu ermitteln welcher User an welchem PC angemeldet ist.
Hier trotzdem der Code:
Code:
public static IList<string> GetUserLoggedOnOnPC(string wks)
        {
            //create a local management scope
            ConnectionOptions o = new ConnectionOptions();
            o.Username = "deinUserNameDesDomainAdmin";
            o.Password = "dasPw";
            //o.Authority = "ntdlmdomain:dieDomain.de";
//wks ist bei uns die rechnernnumer, die brauchst du ja auch noch. oder was anderes um den rechner zu identifizieren
            ManagementScope managementScope = new ManagementScope("\\\\"+wks+"\\root\\cimv2", o);
            //create a query for all available sessions (LogonType 2 = Interactive; LogonType 10 = RemoteInteractive)
            // Where LogonType = 2 OR LogonType = 10
            ObjectQuery sessionQuery = new ObjectQuery("Select * from Win32_LogonSession Where LogonType = 2 OR LogonType = 10");
            // execute the query
            try
            {

                managementScope.Connect();
            }
            catch (Exception e)
            {
                return new List<string>();
            }
            ManagementObjectSearcher sessionObjectSearcher = new ManagementObjectSearcher(managementScope, sessionQuery);
            ManagementObjectCollection sessionObjectCollection = sessionObjectSearcher.Get();

            //iterate through all sessions
            List<string> userNames = new List<string>();

            foreach (ManagementObject sessionObjectItem in sessionObjectCollection)
            {
                //determine properties
                string logonId = sessionObjectItem["LogonId"] as string;

                //create a new query to get the user information for the selected session
                // Where AssocClass=Win32_LoggedOnUser Role=Dependent
                ObjectQuery associatorQuery = new ObjectQuery(string.Concat("Associators of {Win32_LogonSession.LogonId=", logonId, "}Where AssocClass=Win32_LoggedOnUser Role=Dependent"));
                // execute the query
                ManagementObjectSearcher associatorObjectSearcher = new ManagementObjectSearcher(managementScope, associatorQuery);
                ManagementObjectCollection associatorObjectCollection = associatorObjectSearcher.Get();
                //iterate through all users (should only be one result per session)

                userNames.AddRange(
                    from ManagementObject i in associatorObjectCollection
                    select Convert.ToString(i["FullName"])
                    );

            }
            userNames.RemoveAll(p => p == "__vmware_user__");
            return userNames.Distinct(StringComparer.InvariantCultureIgnoreCase).ToList() ;
        }

Wie gesagt mit Vorsicht zu genießen!
 

Ähnliche Themen

I
Antworten
9
Aufrufe
1.875
I
Zurück
Oben