如何使用c#获取其他进程的环境变量

时间:2016-07-29 13:34:07

标签: c# .net environment-variables

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

我可以获得如下的过程环境变量:

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

StartInfo只返回流程env变量的子集,传递给process.Start()

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

2 个答案:

答案 0 :(得分:4)

没有详细记录,但ProcessStartInfo.EnvironmentVariables不会返回特定进程的环境。

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

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

答案 1 :(得分:0)

从我所能看到的情况来看,这似乎并不是开箱即用的动作。

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

不幸的是,这似乎被锁定了#34;到目前的过程。如果只有一种方法来设定针对你的过程,那么你就是金色的。

幸运的是,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等做同样的事情。抱歉,答案并不容易,但对我来说这听起来像是一个有趣的项目!

编辑:哦,我喜欢链接的可能副本与我做的相同的研究,发现相同的事情,嘿..只是知道我没有复制粘贴,自己做了研究.. < / p>