Example #1
0
        public static List <string> GetLoggedOnUser(string computerName)
        {
            List <string> users = new List <string>();

            try
            {
                var scope = GetManagementScope(computerName);
                scope.Connect();
                var Query    = new SelectQuery("SELECT LogonId  FROM Win32_LogonSession Where LogonType=10");
                var Searcher = new ManagementObjectSearcher(scope, Query);
                var regName  = new Regex(@"(?<=Name="").*(?="")");

                foreach (ManagementObject WmiObject in Searcher.Get())
                {
                    foreach (ManagementObject LWmiObject in WmiObject.GetRelationships("Win32_LoggedOnUser"))
                    {
                        users.Add(regName.Match(LWmiObject["Antecedent"].ToString()).Value);
                    }
                }
            }
            catch (Exception ex)
            {
                users.Add(ex.Message);
            }

            return(users);
        }
        /// <summary>
        /// Get a list of all the logged user on the provided computer. Note that all account will
        /// be returned, such as local service or anonymous logon
        /// </summary>
        /// <param name="computer">The computer to use</param>
        /// <returns>A list of all the logged in users</returns>
        public static async Task <IEnumerable <User> > getLoggedUsers(Computer computer)
        {
            // Perform the operation asynchronously
            return(await Task.Run(() => {
                Dictionary <string, User> users = new Dictionary <string, User>();

                try {
                    var scopeLocal = new ManagementScope($@"\\127.0.0.1\root\cimv2", getConnectionOptions());
                    var scope = new ManagementScope($@"\\{computer.nameLong}\root\cimv2", getConnectionOptions());
                    var Query = new SelectQuery("SELECT LogonId FROM Win32_LogonSession");
                    var Searcher = new ManagementObjectSearcher(scope, Query);
                    var regName = new Regex($"(?i)Domain=\"(?<valueDomain>.+)\",Name=\"(?<valueName>.+)\"");

                    foreach (ManagementObject WmiObject in Searcher.Get())
                    {
                        foreach (ManagementObject LWmiObject in WmiObject.GetRelationships("Win32_LoggedOnUser"))
                        {
                            Match m = regName.Match(LWmiObject["Antecedent"].ToString());
                            if (m.Success)
                            {
                                string login = m.Groups["valueName"].Value;
                                string domain = m.Groups["valueDomain"].Value;

                                // Look for user information
                                ManagementObjectSearcher searcher;
                                if (domain.ToLower() == computer.domain.Split('.')[0].ToLower())
                                {
                                    searcher = new ManagementObjectSearcher(scopeLocal, new SelectQuery($"SELECT * FROM Win32_Account WHERE Name='{login}' AND Domain='{domain}'"));
                                }
                                else
                                {
                                    searcher = new ManagementObjectSearcher(scope, new SelectQuery($"SELECT * FROM Win32_Account WHERE Name='{login}' AND Domain='{domain}'"));
                                }

                                try {
                                    foreach (ManagementObject mo in searcher.Get())
                                    {
                                        if (users.ContainsKey(mo["SID"].ToString()))
                                        {
                                            continue;
                                        }

                                        users[mo["SID"].ToString()] = (new User()
                                        {
                                            caption = mo["Caption"].ToString(),
                                            description = mo["Description"].ToString(),
                                            domain = mo["Domain"].ToString(),
                                            localAccount = (bool)mo["LocalAccount"],
                                            name = mo["Name"].ToString(),
                                            SID = mo["SID"].ToString(),
                                            SIDType = (byte)mo["SIDType"],
                                            status = mo["Status"].ToString()
                                        });
                                    }
                                } catch (Exception) {
                                    // Ignore not found
                                }
                            }
                        }
                    }
                } catch (Exception e) {
                    throw new WMIException()
                    {
                        error = e, computer = computer.nameLong
                    };
                }

                return users.Values.AsEnumerable();
            }));
        }