【问题标题】:How to get other process's environment variable using c# [duplicate]如何使用c#获取其他进程的环境变量[重复]
【发布时间】:2016-07-29 22:03:15
【问题描述】:

我有一个提升的进程,我正在尝试使用 C# 从另一个进程中提取环境变量。我知道使用 Process Explorer 存在该变量。

我可以得到如下进程环境变量:

Process process = Process.GetProcessesByName("someprocess").First();
string value = process.StartInfo.EnvironmentVariables["var_name"];

但是StartInfo只返回进程环境变量的子集,传递给process.Start()

如何获取在进程运行时设置的环境变量?

【问题讨论】:

    标签: c# .net environment-variables


    【解决方案1】:

    没有很好的文档记录,但是ProcessStartInfo.EnvironmentVariables 没有返回特定进程的环境。

    如果您查看reference source,您会看到在后台调用了GetEnvironmentStrings function。此函数返回“指向包含调用进程的环境变量(系统和用户环境变量)的内存块的指针”。

    访问另一个进程的环境块有点棘手。 Oleksiy Gapotchenko 写了一个excellent blog post 并提供了一个示例解决方案。

    【讨论】:

      【解决方案2】:

      据我所知,这似乎不是开箱即用支持的操作。

      最接近的是 Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Process);

      不幸的是,这似乎被“锁定”到了当前进程。如果只有一种方法可以设置目标流程,那您将是黄金。

      幸运的是,Microsoft 提供了一个“参考源”,您可以使用它来查看 .NET 中的底层代码是什么(在本例中为 http://referencesource.microsoft.com/#mscorlib/system/environment.cs,20e3d8aa4eb8f4b1)。如果函数支持做你想做的事,你可以为它制作自己的包装器。

      如果你追查到,你会发现在不安全的上下文中的 Win32 调用最终要负责:http://referencesource.microsoft.com/mscorlib/R/c48702b7df790f4c.html

      看起来即使该调用已锁定到当前进程,所以您需要为它编写自己的代码。这是 C(或 C++,不能告诉大声笑)中的一个示例: http://www.codeproject.com/Articles/25647/Read-Environment-Strings-of-Remote-Process

      您可以将其要点翻译成不安全的 C#,并根据需要使用 DllImports 等执行相同的操作。抱歉,答案并不简单,但对我来说这听起来是一个有趣的项目!

      编辑:哦,我喜欢链接的可能重复项如何进行与我所做的相同的研究,发现相同的东西,呵呵..要知道我不只是复制粘贴,而是自己进行了研究..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-02
        • 1970-01-01
        • 1970-01-01
        • 2011-08-19
        • 2015-12-15
        • 2019-05-15
        • 2020-10-29
        • 2021-11-15
        相关资源
        最近更新 更多