首页 > 解决方案 > 在 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 文件的路径。是否有另一种方法来确定该过程是否确实是您正在寻找的过程?除了可执行文件的路径之外,还可以检查什么?

标签: c#

解决方案


你不能。您必须以管理员身份运行才能获取进程的路径。

只要您以管理员身份运行,您就不需要所有多余的代码就可以使用它:

string path = Process.GetProcessesByName("processfilename")[0].MainModule.FileName;

推荐阅读