Как убить определенный процесс, запущенный под определенной учетной записью пользователя. используя С#?
Спасибо,
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";
}
Чтобы получить имя пользователя, вы должны захватить контекст безопасности процесса из 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 с С#.