如何在 Mac 上的 C# 中区分进程的用户



我正在运行以下代码来打印机器中当前运行的所有进程的信息:

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
...

有没有办法区分流程所有者?我想监视来自多个用户的进程。

SessionId是终端服务会话的标识符。终端服务是一个windows组件,它对MacOS来说没有意义。我不知道为什么SessionId在你的机器上总是0。对我来说,SessionId在大多数情况下等于PID。

然而,SessionId在Windows上的托管代码中也没有用处,因为它不允许与拥有进程的用户建立明确的关系。对非托管代码的调用(通过WMI或Win32 API(可以通过SessionId或PID获取用户名,如这里所示。

至于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

最新更新