2016-07-29 112 views
1

我有一個提升進程,我試圖從另一個使用C#的進程中提取環境變量。我知道該變量通過使用Process Explorer存在。如何使用c獲得其他進程的環境變量#

我可以得到過程的環境變量如下所示:

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

StartInfo只返回過程ENV變量的一個子集,傳遞給的Process.Start()

如何獲取在進程運行時間內設置蜜蜂的環境變量?

回答

2

它沒有很好的記錄,但ProcessStartInfo.EnvironmentVariables不返回特定過程的環境。

如果你看看reference source,你會發現在引擎蓋下GetEnvironmentStrings function被調用。該函數返回「一個指向包含調用進程(系統和用戶環境變量)的環境變量的內存塊的指針」。

訪問另一個進程的環境塊有點棘手。 Oleksiy Gapotchenko撰寫了一份excellent blog post,並提供了一個樣本解決方案。

0

從我能找到它看起來這不僅僅是一個支持開箱即用的動作。

最接近的是 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等必要做同樣的事情..對不起答案ISN那麼簡單,但對我來說這聽起來像一個有趣的項目!

編輯:哦,我愛的鏈接可能重複的是怎麼做的我做了同樣的研究,發現了同樣的事情,嘿..只要知道,我不只是複製粘貼,做的研究自己..

相關問題