c# - 在 C# 中获取没有管理员权限的进程路径
问题描述
我正在尝试在没有管理员权限的情况下获取正在运行的进程的路径。网上有很多教程,但我无法让它们工作。这是以管理员身份运行时非常有效的基本前提:
// 主要的
Process pname = Process.GetProcessesByName(processName)[0];
string path = GetExecutablePath(pname);
// 接口
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
我安装的 process 是否已经在机器上运行。进程A
需要管理员权限,它通常是作为服务的启动器。机器上有许多进程,名为A
. 为了查明,如果这是我的进程,我检查了 exe 文件的路径。是否有另一种方法来确定该过程是否确实是您正在寻找的过程?除了可执行文件的路径之外,还可以检查什么?
解决方案
你不能。您必须以管理员身份运行才能获取进程的路径。
只要您以管理员身份运行,您就不需要所有多余的代码就可以使用它:
string path = Process.GetProcessesByName("processfilename")[0].MainModule.FileName;
推荐阅读
- python - Python - 在 CSV 或 XLS 中匹配的正则表达式,并返回匹配的位置
- java - Android Studio androidx.coordinatorlayout error and how to set up 3Dot Menu?
- string - Oracle SQL:我应该如何识别字符串的长度?
- flash - Adobe Air 错误 #3001:文件或目录访问被拒绝
- python - Python中的偏相关
- docker - 如何在离线环境中同时使用 swagger-editor 和 swagger-codegen docker 镜像
- r - geom_dot 为不同的组提供不同的点大小并将一个放在前面
- r - R - 从现有列值创建和命名数据框
- android - 用 constrainLayout 替换滚动视图中的加权线性布局
- python - 类实例是否在后台持续存在?