【问题标题】:How to get the path of a system file如何获取系统文件的路径
【发布时间】:2021-10-07 19:59:03
【问题描述】:

有没有办法从 processId 中获取系统文件的路径,例如“wininit.exe”?下面的代码不起作用。 Process.GetProcesses() 也不返回任何合乎逻辑的东西。请帮帮我。

附:我正在尝试根据自己的需要编写自己的任务管理器。

    private static string GetMainModuleFilepath(int processId)
    {
        string wmiQueryString = "SELECT ProcessId, ExecutablePath FROM Win32_Process WHERE ProcessId = " + processId;
        using (var searcher = new ManagementObjectSearcher(wmiQueryString))
        {
            using (var results = searcher.Get())
            {
                ManagementObject mo = results.Cast<ManagementObject>().FirstOrDefault();
                if (mo != null)
                {
                    return (string)mo["ExecutablePath"];
                }
            }
        }
        return null;
    }

【问题讨论】:

    标签: c# winforms process wmi-query


    【解决方案1】:

    您可以使用Process.GetProcessById 方法并传入ProcessId。

    然后您可以在ProcessModule 上使用MainModule.FileName 属性。

    我的完整代码如下所示:(我在控制台应用程序中完成了此操作以加快编写速度)

    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine("Enter Process ID:");
            var processIdString = Console.ReadLine();
            var parsed = int.TryParse(processIdString, out var procId);
            if (parsed)
            {
                var path = GetMainModuleFilepath(procId);
                Console.WriteLine($"Found Path: {path}");
            }
            else
            {
                Console.WriteLine("Process Id must be a number!");
            }
        }
    }
    
    private static string GetMainModuleFilepath(int processId)
    {
        var process = Process.GetProcessById(processId);
        if (process == null)
        {
            return string.Empty;
        }
    
        return process.MainModule?.FileName;
    }
    

    结果如下:

    注意: If you are running this code in 32 bit application, you'll not be able to access 64-bit application paths, so you'd have to compile and run you app as 64-bit application (Project Properties → Build → Platform Target → x64).

    【讨论】:

    • 感谢 ConnorTJ 的回答。但是,由于某种原因,即使完全禁用了 UAC,我仍然无法访问 wininit.exe 文件,并且我的控制台应用程序正在以管理员权限运行。您认为这是偶然访问系统文件吗?
    • @csharpuru1991 在使用我提供的代码时,您是否遇到任何异常?例如Win32Exception?根据文档:docs.microsoft.com/en-us/dotnet/api/… 问题在于它是一个 32 位进程,试图访问 64 位进程的模块。
    • 但是当您调试代码时,请查看您收到的任何异常消息并尝试使用它们来解决问题,例如Access DeniedCannot enumerate modules 等...
    • 如果我在 x86 上运行:它显示“Win32Exception: 'A 32 位进程无法访问 64 位进程的模块。”但是当我在 x64 上运行时,它显示“访问被拒绝”。我点击属性 -> 构建 -> 平台目标 -> x64 切换它
    • @csharpuru1991 如果您尝试此答案,它对您有用吗?如果没有,我相信您可能无法访问特定进程的目录stackoverflow.com/a/46004513/13108684
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2011-10-30
    • 2015-11-16
    • 2013-08-05
    相关资源
    最近更新 更多