如何杀死在特定用户帐户下运行的特定进程

时间:2009-06-18 08:02:18

标签: c# windows

如何杀死在特定用户帐户下运行的特定进程。使用C#?

谢谢,

2 个答案:

答案 0 :(得分:5)

var processes = from p in Process.GetProcessesByName(nameOfTheProcess)
                where p.StartInfo.UserName == nameOfTheUser
                select p;

foreach(Process p in processes) p.Kill();

编辑:正如Fredrik指出的那样,没有为GetProcesses获取的进程设置UserName属性。这是一个使用WMI获取用户名的修改版本(找到GetProcessOwner方法here):

static void KillProcessByNameAndUserName(string processName, string userName)
{
    var processes = from p in Process.GetProcessesByName(processName)
                    where GetProcessOwner(p.Id) == userName
                    select p;

    foreach(Process p in processes) p.Kill();
}

static string GetProcessOwner(int processId)
{

    string query = “Select * From Win32_Process Where ProcessID = “ + processId;
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
    ManagementObjectCollection processList = searcher.Get();

    foreach (ManagementObject obj in processList)
    {
        string[] argList = new string[] { string.Empty };
        int returnVal = Convert.ToInt32(obj.InvokeMethod(“GetOwner”, argList));
        if (returnVal == 0)
            return argList[0];
    }

    return “NO OWNER”;

}

答案 1 :(得分:0)

要获取用户名,您必须从Win32 API获取该进程的安全上下文。

使用上面已有的代码中的.Net Process类中的进程句柄,通过P / Invoke调用OpenProcessToken()函数。您将获得包含进程所有者的SID的结构。为“拒绝访问”等错误做好准备,因为您可能没有访问权限来获取所有进程的此信息,例如那些不属于您的进程。从那里,您必须将SID转换为名称。有几种方法可以做到这一点,但LookupAccountSid()函数(再次,通过P / Invoke)将为您获取用户名。

在框架2.0中,添加了一堆东西来帮助处理安全描述符(System.Security.AccessControl命名空间),但是,我没有看到任何可以帮助你处理那里的P / Invoke复杂性的东西

有关使用C#中的Win32 API的信息,请参阅pinvoke.net