Как убить определенный процесс, запущенный под определенной учетной записью пользователя - PullRequest
2 голосов
/ 18 июня 2009

Как убить определенный процесс, запущенный под определенной учетной записью пользователя. используя C #?

Спасибо

Ответы [ 2 ]

5 голосов
/ 18 июня 2009
var processes = from p in Process.GetProcessesByName(nameOfTheProcess)
                where p.StartInfo.UserName == nameOfTheUser
                select p;

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

РЕДАКТИРОВАТЬ: как указал Фредрик, свойство UserName не устанавливается для процессов, полученных GetProcesses. Вот модифицированная версия, которая использует WMI для получения имени пользователя (найден метод GetProcessOwner здесь ):

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”;

}
0 голосов
/ 18 июня 2009

Чтобы получить имя пользователя, вам нужно получить контекст безопасности процесса из Win32 API.

Вызовите функцию OpenProcessToken () через P / Invoke, используя дескриптор процесса, найденный в классе .Net Process из кода, который вы уже использовали выше. Вы получите структуру, содержащую идентификатор безопасности для владельца процесса. Будьте готовы к таким ошибкам, как «Отказ в доступе», поскольку у вас могут не быть прав доступа для получения этой информации для всех процессов, например, тех, которые не принадлежат вам. Оттуда вы должны преобразовать SID в имя. Есть несколько способов сделать это, но функция LookupAccountSid () (снова через P / Invoke) получит имя пользователя для вас.

В фреймворке 2.0 было добавлено несколько вещей, помогающих работать с дескрипторами безопасности (пространство имен System.Security.AccessControl), однако я не вижу ничего, что помогло бы вам справиться со сложностями P / Invoke. .

См. pinvoke.net для получения информации об использовании Win32 API из C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...