in Lib/Collectors/UserAccountCollector.cs [78:165]
internal void ExecuteLinux(CancellationToken cancellationToken)
{
var etc_passwd_lines = File.ReadAllLines("/etc/passwd");
var etc_shadow_lines = File.ReadAllLines("/etc/shadow");
Dictionary<string, GroupAccountObject> Groups = new Dictionary<string, GroupAccountObject>();
var accountDetails = new Dictionary<string, UserAccountObject>();
foreach (var _line in etc_passwd_lines)
{
if (cancellationToken.IsCancellationRequested) { break; }
var parts = _line.Split(':');
if (!accountDetails.ContainsKey(parts[0]))
{
accountDetails[parts[0]] = new UserAccountObject(parts[0])
{
UID = parts[2],
GID = parts[3],
FullName = parts[4],
HomeDirectory = parts[5],
Shell = parts[6]
};
}
}
foreach (var _line in etc_shadow_lines)
{
if (cancellationToken.IsCancellationRequested) { break; }
var parts = _line.Split(':');
var username = parts[0];
if (!accountDetails.ContainsKey(username))
{
accountDetails[username] = new UserAccountObject(username)
{
};
}
var tempDict = accountDetails[username];
if (parts[1].Contains("$"))
{
tempDict.PasswordStorageAlgorithm = parts[1].Split('$')[1];
}
tempDict.PasswordExpires = parts[4];
tempDict.Inactive = parts[6];
tempDict.Disabled = parts[7];
accountDetails[username] = tempDict;
}
foreach (var username in accountDetails.Keys)
{
if (cancellationToken.IsCancellationRequested) { break; }
// Admin user details
var groupsRaw = ExternalCommandRunner.RunExternalCommand("groups", username);
var groups = groupsRaw.Split(' ');
foreach (var group in groups)
{
if (group.Equals("sudo"))
{
accountDetails[username].Privileged = true;
}
accountDetails[username].Groups.Add(group);
if (Groups.ContainsKey(group))
{
Groups[group].Users.Add(username);
}
else
{
Groups[group] = new GroupAccountObject(group);
Groups[group].Users.Add(username);
}
}
HandleChange(accountDetails[username]);
}
foreach (var group in Groups)
{
if (cancellationToken.IsCancellationRequested) { break; }
HandleChange(group.Value);
}
}