列出 C# 中的管理员进程

本文关键字:管理员 进程 列出 | 更新日期: 2023-09-27 18:36:04

我正在尝试用 C# 打印所有正在运行的进程,类似于 tasklistps 的方式。我使用以下代码尝试了它:

foreach(Process process in Process.GetProcesses()) {
    if(!process.HasExited) {
        Console.WriteLine(process.ProcessName);
    }
}

但是有了它,我在 Windows 上遇到了一些问题(没有在 Linux 上尝试):

  • 当我以用户权限执行上述代码时,它只打印该用户启动的进程。如果我以管理员身份运行它,则会打印所有进程。
  • 当我使用用户权限打开cmd窗口并列出进程(即执行tasklist)时,将打印所有进程,甚至由系统/管理员帐户启动的进程。

有没有办法获取所有进程,即使是由更高权限用户启动的进程,而不需要以管理员身份运行程序?

我想到了一个解决方案:

System.Diagnostics.Process.Start("CMD.exe", "tasklist > C:'file.txt");
String[] processes = File.ReadAllLines(@"C:'file.txt");

但这真的很笨拙,在 Linux 上不起作用。

列出 C# 中的管理员进程

你不能。不能让同一进程在提升模式和用户模式下运行部件。这就是他们构建它的方式,主要是出于安全原因。你不能只是绕过它。

关于你不能做的事情就够了。你能做什么?您可以启动在提升模式下运行的第二个(不同的)程序,也可以在需要提升权限的部分时重新启动当前应用程序。为此,您需要Process.Start,并且必须将ProcessStartInfo.Verb设置为"runas"

ProcessStartInfo startInfo = new ProcessStartInfo(exePath);
startInfo.Verb = "runas";
Process.Start(startInfo);

经过一些测试,我发现管理员进程将显示Process.GetProcesses()列表中,管理员特权进程的布尔值 HasExited 始终为真(即使它尚未关闭)

所以我只是循环浏览列表而不检查process.HasExited

foreach(Process process in Process.GetProcesses()) {
    if(!process.HasExited) { //running process with user privileges
        //do some stuff here
    }
    else { //closed process or administrator process
        //do some stuff here
    }
}

对于该过程实际上已停止的情况,我将其包装在try-catch块中。

由于这个解决方案对我来说似乎不是最佳的,所以我把这个问题留给大家。