获取管理员进程

时间:2015-01-04 19:15:51

标签: c# windows privileges

我尝试过这样的所有流程:

List<string> processes = new List<string>();
foreach(Process process in Process.GetProcesses())
{
    if(!process.HasExited)
        processes.Add(process.ProcessName);
}
  • 如果我使用用户权限运行程序,我只会获得此用户启动的进程,但如果我以管理员身份运行它,我就会得到所有权限。
  • 如果您运行具有用户权限的cmd,您甚至可以获得管理员进程。 (tasklist

所以我的问题是:有没有一种正确的方法可以获得所有流程? (不强制程序以管理员身份运行)

我不想强迫自己这样做:

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

2 个答案:

答案 0 :(得分:3)

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

足够你能做什么。你能做什么?您可以启动以提升模式运行的第二个(不同)程序,或者在有需要提升权限的部分时重新启动当前应用程序。您需要Process.Start,因此您需要将ProcessStartInfo.Verb设置为"runas"

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

Process.Start(startInfo);

答案 1 :(得分:0)

OP在这里。
经过几个小时的测试我发现,管理员处理显示在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
    }
}