Я пытаюсь получить путь к запущенному процессу без прав администратора. Есть много обучающих программ онлайн, но я не могу заставить их работать. Это базовая 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
. Чтобы выяснить, если это мой процесс, я проверил путь к исполняемому файлу. Есть ли другой способ определить, действительно ли процесс тот, который вы ищете? Что еще можно проверить, кроме пути к исполняемому файлу?