列出 C# 中的管理员进程
本文关键字:管理员 进程 列出 | 更新日期: 2023-09-27 18:36:04
我正在尝试用 C# 打印所有正在运行的进程,类似于 tasklist
或 ps
的方式。我使用以下代码尝试了它:
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 上不起作用。
你不能。不能让同一进程在提升模式和用户模式下运行部件。这就是他们构建它的方式,主要是出于安全原因。你不能只是绕过它。
关于你不能做的事情就够了。你能做什么?您可以启动在提升模式下运行的第二个(不同的)程序,也可以在需要提升权限的部分时重新启动当前应用程序。为此,您需要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
块中。
由于这个解决方案对我来说似乎不是最佳的,所以我把这个问题留给大家。