2012-02-23 140 views
4

如何從VB6代碼中爲永久用戶環境變量設置一個將在非管理員權限下運行的應用程序?如何設置永久用戶環境變量?

我知道SetEnvironmentValue但顯然這隻會改變當前過程的變化,這不足以滿足我的需求。

因爲環境變量可能存儲在HKLM註冊表中,所以我擔心運行我的應用程序的非管理員用戶將無法設置env var。

+0

如果沒有管理員權限,則無法設置系統範圍的變量。如果可以的話,對於惡意應用程序來說,顛覆(說)系統PATH變量並強制它自己的惡意DLL被加載而不是標準系統DLL變得微不足道。您最多可以爲當前用戶設置變量。 – 2012-02-23 02:43:08

+0

@MarcB:我正在談論用戶環境變量,而不是系統環境變量。是否有一種方法將它們設置在當前過程的範圍之外? – CJ7 2012-02-23 02:44:17

回答

2

對於當前用戶,環境變量存儲在/HKEY_CURRENT_USER/Environment下,這不應該要求提升的權限。

+0

我生鏽的VB6,但這個答案可能有所幫助:http://stackoverflow.com/a/492000/119549 – Jacob 2012-02-23 02:52:38

+0

什麼時候該變化是可見的進程? – CJ7 2012-02-23 05:26:53

2

VB6大師卡爾彼得森編寫了一個可重用模塊來處理設置用戶或系統環境變量。請參閱2009年的Visual Studio雜誌的hereDirect link to code

+0

該鏈接似乎是關於文件夾而不是env vars。 – CJ7 2012-02-23 04:25:46

+0

@CraigJ糟糕,一定是粘貼了錯誤的鏈接!現在試試。 – MarkJ 2012-02-23 04:28:28

+0

您是否認爲此代碼可能存在任何問題,特別是SendMessageTimeout調用,由非管理員用戶在相當鎖定的環境中運行? – CJ7 2012-02-27 10:25:53

0

我寫了很久以前的這個方便的課,以完成您所問的內容。

http://www.vbrad.com/pf.asp?p=Source/src_environment.htm

+0

我發現即使在使用SendMessageTimeout函數後,我的應用程序也必須重新啓動,以便對應用程序可以看到用戶env var的更改。那是預期的行爲? – CJ7 2012-02-28 01:25:52

+0

@CraigJ不是真的,它應該在理論上工作。您的應用是否與執行廣播的應用使用相同的用戶?另外,我十多年前就寫了這個代碼。 – AngryHacker 2012-02-28 18:10:00