我试图访问其他用户的进程图像路径。 (我试图弄清楚当前正在运行的进程是否也已由其他用户运行。)
从Vista开始,.NET的System.Diagnostics.Process.MainModule
属性将在没有UAC的情况下失败。相反,Win32建议首先使用带有OpenProcess
标志的PROCESS_QUERY_LIMITED_INFORMATION
来获取句柄,然后QueryFullProcessImageName
。但是,除非进程是我自己的,否则这会失败,或者我首先提升我的进程。致电Marshal.GetLastWin32Error()
然后给我ERROR_ACCESS_DENIED
。
我的理解是查询有限信息'的全部内容。我不应该提升。
以下是我如何实施它:
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);
[Flags]
public enum ProcessAccessFlags : uint
{
QueryLimitedInformation = 0x1000
}
[DllImport("kernel32.dll")]
private static extern bool QueryFullProcessImageName(IntPtr hprocess, int dwFlags,
StringBuilder lpExeName, out int size);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess,
bool bInheritHandle, int dwProcessId);
public static string GetMainModulePath(this Process process)
{
if (Environment.OSVersion.Version.Major < 6)
return process.MainModule.FileName;
var buffer = new StringBuilder(1024);
IntPtr hprocess = OpenProcess(ProcessAccessFlags.QueryLimitedInformation, false, process.Id);
if (hprocess != IntPtr.Zero)
{
try
{
int size = buffer.Capacity;
if (QueryFullProcessImageName(hprocess, 0, buffer, out size))
return buffer.ToString();
}
finally
{
CloseHandle(hprocess);
}
}
return string.Empty;
}
然后我简单地称之为:
foreach (var item in Process.GetProcessesByName("chrome"))
{
item.GetMainModulePath();
}
这根本不受支持吗?
答案 0 :(得分:0)
作为标准用户,您无权查看其他用户流程的此信息。这就是安全模型的设计方式以及系统按预期工作的方式。
如果您希望强制执行通常使用命名互斥锁完成的程序的单个实例。之前已经多次讨论过这个话题,我不会重现别人在这个问题上已经说过的话。