Как вы получаете UserName владельца процесса? - PullRequest
15 голосов
/ 19 ноября 2008

Я пытаюсь получить список процессов, в настоящее время принадлежащих текущему пользователю (Environment.UserName). К сожалению, у класса Process нет никакого способа получить имя пользователя пользователя, владеющего процессом.

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

Если для вашего решения требуется pinvoke, предоставьте пример кода.

Ответы [ 7 ]

16 голосов
/ 19 ноября 2008

Спасибо, ваши ответы поставили меня на правильный путь. Для тех, кому нужен пример кода:

public class App
{
    public static void Main(string[] Args)
    {
        Management.ManagementObjectSearcher Processes = new Management.ManagementObjectSearcher("SELECT * FROM Win32_Process");

        foreach (Management.ManagementObject Process in Processes.Get()) {
            if (Process["ExecutablePath"] != null) {
                string ExecutablePath = Process["ExecutablePath"].ToString();

                string[] OwnerInfo = new string[2];
                Process.InvokeMethod("GetOwner", (object[]) OwnerInfo);

                Console.WriteLine(string.Format("{0}: {1}", IO.Path.GetFileName(ExecutablePath), OwnerInfo[0]));
            }
        }

        Console.ReadLine();
    }
}
10 голосов
/ 19 ноября 2008

Статья CodeProject Как получить идентификатор владельца процесса и SID текущего пользователя с помощью Warlib описывает, как это сделать с помощью WMI и Win32 API через PInvoke.

Код WMI намного проще, но выполняется медленнее. Ваш вопрос не указывает, что будет более подходящим для вашего сценария.

2 голосов
/ 27 февраля 2013

Попросите Эндрю Мура за его ответ, я просто форматирую его, потому что он не скомпилирован в C # 3.5.

private string GetUserName(string procName)
{
    string query = "SELECT * FROM Win32_Process WHERE Name = \'" + procName + "\'";
    var procs = new System.Management.ManagementObjectSearcher(query);
    foreach (System.Management.ManagementObject p in procs.Get())
    {
        var path = p["ExecutablePath"];
        if (path != null)
        {
            string executablePath = path.ToString();
            string[] ownerInfo = new string[2];
            p.InvokeMethod("GetOwner", (object[])ownerInfo);
            return ownerInfo[0];
        }
    }
    return null;
}
2 голосов
/ 23 сентября 2011

Вам будет сложно получить имя пользователя, не будучи администратором на компьютере.

Ни один из методов с WMI, через OpenProcess или с использованием WTSEnumerateProcesses не даст вам имя пользователя, если вы не являетесь администратором. Попытка включить SeDebugPrivilege и т. Д. Также не работает. Мне еще предстоит увидеть код, который работает, не будучи администратором.

Если кто-то знает, как получить это БЕЗ администратора на машине, на которой он запускается, пожалуйста, напишите, как это сделать, поскольку я не нашел, как включить этот уровень доступа для пользователя службы.

2 голосов
/ 19 ноября 2008

вот ссылка MS , помеченная как «метод GetOwner класса Win32_Process»

2 голосов
/ 19 ноября 2008

Вы можете посмотреть на использование System.Management (WMI). После этого вы можете запросить дерево Win32_Process.

0 голосов
/ 18 октября 2017

Вам нужно добавить ссылку на System.Management.dll, чтобы это работало.

Вот что я в итоге использовал. Работает в .NET 3.5:

using System.Linq;
using System.Management;

class Program
{
    /// <summary>
    /// Adapted from https://www.codeproject.com/Articles/14828/How-To-Get-Process-Owner-ID-and-Current-User-SID
    /// </summary>
    public static void GetProcessOwnerByProcessId(int processId, out string user, out string domain)
    {
        user = "???";
        domain = "???";

        var sq = new ObjectQuery("Select * from Win32_Process Where ProcessID = '" + processId + "'");
        var searcher = new ManagementObjectSearcher(sq);
        if (searcher.Get().Count != 1)
        {
            return;
        }
        var process = searcher.Get().Cast<ManagementObject>().First();
        var ownerInfo = new string[2];
        process.InvokeMethod("GetOwner", ownerInfo);

        if (user != null)
        {
            user = ownerInfo[0];
        }
        if (domain != null)
        {
            domain = ownerInfo[1];
        }
    }

    public static void Main()
    {
        var processId = System.Diagnostics.Process.GetCurrentProcess().Id;
        string user;
        string domain;
        GetProcessOwnerByProcessId(processId, out user, out domain);
        System.Console.WriteLine(domain + "\\" + user);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...