C # запрос для владельца процесса (Windows 7 x64) - PullRequest
2 голосов
/ 14 января 2012

Я хотел бы знать, как запросить владельца процесса в (или через) C #.Я пробовал пример на http://www.codeproject.com/KB/cs/processownersid.aspx.

WMI: Может запрашивать все процессы и их владельцев, но это слишком медленно.

WIN32: Быстро, но я получаю исключение, в котором отказано в разрешении, когдазапрашиваю владельца любого процесса, кроме моего.

Я пытался реализовать олицетворение для решения проблемы WIN32, нет.Я также попытался запустить скомпилированный .exe от имени администратора, не пошел.Я только на несколько месяцев разбираюсь в C #, так что успокойся.

Ответы [ 2 ]

0 голосов
/ 14 января 2012

Я добавил следующее в пример Win32 из: http://www.codeproject.com/KB/cs/processownersid.aspx

static void ProcessSID(Process process)
{
    string sid;
    ExGetProcessInfoByPID(process.Id, out sid);
    Console.WriteLine("{0} {1} {2}", process.Id, process.ProcessName, sid);
}

static void Main(string[] args)
{
    foreach (Process process in Process.GetProcesses())
    {
        ProcessSID(process);
    }
}

, и когда я запускаю его как администратор, он успешно печатает SID для всех процессов (кроме системных и защищенных процессов, таких как audiodg),Это не приводит к ошибке отказа в доступе.

Этот код работает для вас?

Я также использую Windows 7 x64.

Обновление

Это работает для всех процессов, кроме процессов RunAs.Проблема заключается во внутренних элементах Process.Handle, которые запрашивают слишком много разрешений.

Если вы замените вызов Process.Handle на

IntPtr procHandle=OpenProcess(ProcessAccessFlags.QueryInformation, false, PID);

и добавите следующие определения, то кодтакже работает с процессами RunAs.

[Flags]
enum ProcessAccessFlags : uint
{
    All = 0x001F0FFF,
    Terminate = 0x00000001,
    CreateThread = 0x00000002,
    VMOperation = 0x00000008,
    VMRead = 0x00000010,
    VMWrite = 0x00000020,
    DupHandle = 0x00000040,
    SetInformation = 0x00000200,
    QueryInformation = 0x00000400,
    Synchronize = 0x00100000,
    ReadControl = 0x00020000
}

[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);
0 голосов
/ 14 января 2012

Похоже, я сначала неправильно понял вопрос, извините.Просто нашел интересную тему на эту тему, которая может вам помочь.

...