C# 在C中获取没有管理员权限的进程路径#

C# 在C中获取没有管理员权限的进程路径#,c#,C#,我正在尝试获取没有管理员权限的正在运行进程的路径。网上有很多教程,但我无法让它们发挥作用。这是作为管理员运行时非常有效的基本前提: //主要 Process pname = Process.GetProcessesByName(processName)[0]; string path = GetExecutablePath(pname); //原料药 private static string GetExecutablePath(Process process) {

我正在尝试获取没有管理员权限的正在运行进程的路径。网上有很多教程,但我无法让它们发挥作用。这是作为管理员运行时非常有效的基本前提:

//主要

   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
,是否已经在机器上运行。流程
A
需要管理员权限,通常作为服务启动。机器上有许多进程,它们被命名为
A
。为了找出答案,如果这是我的进程,我检查了exe文件的路径。是否有其他方法来确定流程是否确实是您正在寻找的流程?除了可执行文件的路径之外,还可以检查哪些内容?

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

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

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

与管理员权限配合非常好。在问题中包括这些信息,以及具体的错误/异常消息:这将导致更好的关注和接受。我同意,问题的形式非常复杂(时间太晚了)。我添加了一些编辑。API就是这样设计的,所以您没有其他方法。它返回的不是与
[Process].MainModule.FileName
相同的内容吗?(除此之外,OpenProcess使用
进程(查询)信息|进程(虚拟机)读取