Re: Завершить процессы запущенные системной(текущей) учеткой
От: 4058  
Дата: 10.01.22 12:30
Оценка: 4 (1)
Здравствуйте, vaa, Вы писали:

vaa>Environment.UserName при вызове из под LocalSystem

vaa>равно имя пк + знак $
vaa>tasklist /v выдает NT AUTHORITY\СИСТЕМА, т.е. с Environment.UserName вообще никак не стыкуется.
vaa>StartInfo не доступен тк процессы были созданы другим процессом.
vaa>WMI очень не хочется использовать т.к. он часто ломается и может или подвесить или убить процесс.
vaa>Какой самый простой способ определить имя пользователя запустившего процесс?

Совсем простого способа нет (по причине соображений безопасности), поэтому если не хочется использовать WMI, то можно воспользоваться WinAPI:


using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Security.Principal;

...

private static string GetProcessUser(Process process)
{
    IntPtr processHandle = IntPtr.Zero;
    try
    {
        OpenProcessToken(process.Handle, 8, out processHandle);
        WindowsIdentity wi = new WindowsIdentity(processHandle);
        string user = wi.Name;
        return user.Contains(@"\") ? user.Substring(user.IndexOf(@"\") + 1) : user;
    }
    catch
    {
        return null;
    }
    finally
    {
        if (processHandle != IntPtr.Zero)
        {
            CloseHandle(processHandle);
        }
    }
}

[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool OpenProcessToken(IntPtr ProcessHandle, uint DesiredAccess, out IntPtr TokenHandle);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CloseHandle(IntPtr hObject);

...

foreach (Process p in Process.GetProcesses())
{
     Console.WriteLine("{0}\t{1}", p.ProcessName, GetProcessUser(p));
}


Способ варварский, при нехватке прав (если запуск не под админом), будет попадать в catch и возвращать null для процессов запущенных под другим пользователем.
Проверено на Win7 и Win10.

Подсмотрено здесь
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.