2012-02-23 117 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