如何在 Mac 上的 C# 中区分进程的用户
Posted
技术标签:
【中文标题】如何在 Mac 上的 C# 中区分进程的用户【英文标题】:How to distinguish process' users in C# on Mac 【发布时间】:2021-12-21 05:24:10 【问题描述】:我正在运行以下代码来打印有关当前在机器中运行的所有进程的信息:
int i = 0;
var r = "";
var processes = Process.GetProcesses();
foreach (var p in processes)
try
r += $"i. p.Id p.ProcessName = p.SessionId\n";
i++;
catch (Exception)
Console.WriteLine(r);
如果我以管理员权限运行构建的应用程序,我可以访问所有进程并且没有异常发生,但是 macOS 上的 SessionId 始终为零:
0. 24976 ProcessNotifier = 0
1. 24970 mdworker_shared = 0
2. 24952 garcon = 0
3. 24951 TextMate = 0
4. 24893 com.apple.iCloudHelper = 0
5. 24770 zsh = 0
...
有没有办法区分进程所有者?我想监控来自多个用户的进程。
【问题讨论】:
【参考方案1】:SessionId 是Terminal Services 会话的标识符。终端服务是一个 Windows 组件,它对 MacOS 没有意义。我不知道为什么 SessionId 在你的机器上总是 0。对我来说,大多数情况下 SessionId 等于 PID。
但是,SessionId 在 Windows 上的托管代码中也没有用,因为它不允许与进程拥有用户建立明确的关系。可以调用非托管代码(通过 WMI 或 Win32 API)以通过 SessionId 或 PID 获取用户名,如演示的here。
对于 MacOS,您只需在 c# 代码中执行外部ps 进程即可获取和解析所需信息:
var startInfo = new ProcessStartInfo("/bin/ps", "-eo pid,user,comm");
startInfo.RedirectStandardOutput = true;
var proc = Process.Start(startInfo);
var output = proc.StandardOutput.ReadToEnd();
Console.WriteLine(output);
样本输出:
PID | User Name | Process
---------------------------------------------------------
335 | _netbios | /usr/sbin/netbiosd
338 | root | /System/Library/Frameworks/GSS.framework/Helpers/GSSCred
341 | boris | /usr/sbin/distnoted
342 | boris | /System/Library/Frameworks/LocalAuthentication.framework/Support/coreauthd
344 | boris | /usr/sbin/cfprefsd
345 | root | /usr/libexec/securityd_service
346 | boris | /usr/libexec/UserEventAgent
【讨论】:
以上是关于如何在 Mac 上的 C# 中区分进程的用户的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JavaScript 中区分 iPhone、iPad 和 iPod?