尽管有PROCESS_QUERY_LIMITED_INFORMATION,OpenProcess:ERROR_ACCESS_DENIED

时间:2017-04-13 09:55:54

标签: c# .net-4.0 pinvoke

我试图访问其他用户的进程图像路径。 (我试图弄清楚当前正在运行的进程是否也已由其他用户运行。)

从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();
        }

这根本不受支持吗?

1 个答案:

答案 0 :(得分:0)

作为标准用户,您无权查看其他用户流程的此信息。这就是安全模型的设计方式以及系统按预期工作的方式。

如果您希望强制执行通常使用命名互斥锁完成的程序的单个实例。之前已经多次讨论过这个话题,我不会重现别人在这个问题上已经说过的话。