Как узнать путь к файлу по имени процесса и имени владельца?

Рейтинг: 3Ответов: 2Опубликовано: 01.02.2011

На терминальном сервере человек 10 запускают приложение, пусть это будет CALC.exe, и естетсвенно, в процессах 10 ОДИНАКОВЫХ процессов.

Здесь мне подсказали, как узнать путь к файлу нужного процесса.

А как сделать тоже самое, только если пользователя зовут ВАСЯ, то процесс запущенный ВАСЕЙ и находился?

Ответы

▲ 3Принят

Самый простой вариант с помощью WMI:

string processName = "calc.exe";
string currentUser = WindowsIdentity.GetCurrent().Name.Split('\\')[1];

string query = "Select * from Win32_Process Where Name = \"" + processName + "\"";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection processes = searcher.Get();

foreach (ManagementObject proc in processes)
{
    string owner;
    string[] argList = new string[] { string.Empty };
    int returnVal = Convert.ToInt32(proc.InvokeMethod("GetOwner", argList));
    if (returnVal == 0)
        owner = argList[0];
    else
        continue;

    if (owner != currentUser)
        continue;

    // Вот тут-то и остался только нужный процесс!
    string path = proc["ExecutablePath"].ToString();
}
▲ 3

На WinApi проблема решалась еще в первом вопросе) Поиск по msdn выдал сразу:

Получаем токен процесса по хендлу: OpenProcessToken(...)

SID пользователя - в информации о токене: GetTokenInformation(...)


@kirelagin:

Оригинал с мсдн:

BOOL WINAPI OpenProcessToken(
  __in   HANDLE ProcessHandle,
  __in   DWORD DesiredAccess,
  __out  PHANDLE TokenHandle
);

В c#:

[DllImport("Advapi32.dll", EntryPoint = "OpenProcessToken")]
private static extern bool OpenProcessToken(int ProcessHandle, int DesiredAccess, int* TokenHandle);