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