Получить путь процесса без прав администратора в C# - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь получить путь к запущенному процессу без прав администратора. Есть много обучающих программ онлайн, но я не могу заставить их работать. Это базовая c предпосылка, которая прекрасно работает при работе от имени администратора:

// main

   Process pname = Process.GetProcessesByName(processName)[0];
   string path = GetExecutablePath(pname);

// api

    private static string GetExecutablePath(Process process) {
        //If running on Vista or later use the new function
        if (Environment.OSVersion.Version.Major >= 6) {
            return GetExecutablePathAboveVista(process.Id);
        }

        return process.MainModule.FileName;
    }


    private static string GetExecutablePathAboveVista(int ProcessId) {
        var buffer = new StringBuilder(1024);
        IntPtr hprocess = OpenProcess(ProcessAccessFlags.QueryLimitedInformation,
                                      false, ProcessId);
        if (hprocess != IntPtr.Zero) {
            try {
                int size = buffer.Capacity;
                if (QueryFullProcessImageName(hprocess, 0, buffer, out size)) {
                    return buffer.ToString();
                }
            } finally {
                CloseHandle(hprocess);
            }
        }
        throw new Win32Exception(Marshal.GetLastWin32Error()); //always throws error
    }


    [DllImport("kernel32.dll")]
    private static extern bool QueryFullProcessImageName(IntPtr hprocess, int dwFlags,
                   StringBuilder lpExeName, out int size);
    [DllImport("kernel32.dll")]
    private static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess,
                   bool bInheritHandle, int dwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr hHandle);

    [Flags]
    public enum ProcessAccessFlags : uint {
        All = 0x001F0FFF,
        Terminate = 0x00000001,
        CreateThread = 0x00000002,
        VirtualMemoryOperation = 0x00000008,
        VirtualMemoryRead = 0x00000010,
        VirtualMemoryWrite = 0x00000020,
        DuplicateHandle = 0x00000040,
        CreateProcess = 0x000000080,
        SetQuota = 0x00000100,
        SetInformation = 0x00000200,
        QueryInformation = 0x00000400,
        QueryLimitedInformation = 0x1000,
        Synchronize = 0x00100000
    }

К сожалению, строка

throw new Win32Exception(Marshal.GetLastWin32Error()); 

всегда выполняется с сообщением об ошибке

System.ComponentModel.Win32Exception: 'Not all privileges or groups referenced are assigned to the caller'

Можно ли найти путь к файлу exe, не работая от имени администратора? Какое решение вы порекомендуете?

Обновление:

Я думаю, что права администратора необходимы, потому что программа, которую я проверяю, была запущена с правами администратора. Таким образом, вопрос можно перефразировать следующим образом: как найти исполняемый путь запущенного процесса, который запускается от имени администратора?

В более широком контексте. Я пытался определить, является ли процесс A, который я установил, уже запущен на машине. Процесс A требует прав администратора, и обычно он запускается как услуга. На машинах много процессов с именем A. Чтобы выяснить, если это мой процесс, я проверил путь к исполняемому файлу. Есть ли другой способ определить, действительно ли процесс тот, который вы ищете? Что еще можно проверить, кроме пути к исполняемому файлу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...