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

2

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

Спасибо,

Теги:

2 ответа

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

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

EDIT: как указал Фредрик, свойство 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";

}
  • 1
    Хм .. этот код компилируется? Похоже, в запросе Linq отсутствует выборка. Как примечание стороны; Я протестировал подобный подход, но свойство UserName объекта StartInfo является пустой строкой для всех процессов.
  • 0
    Я добавил пропущенное «выберите», вероятно, в то же время, когда вы разместили свой комментарий;). Но вы правы насчет имени пользователя, оно не настроено для процессов, которые вы не создали сами ... должен быть другой способ
Показать ещё 1 комментарий
0

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню