微软知识库文章,上次审查于 2007 年 6 月,其中指出:
如果您更新环境变量或添加新的环境变量,则必须重新启动计算机,所做的更改才能影响在本地系统帐户下运行的服务。
我不清楚这是否适用于 Windows Server 2008 R2。有人可以给出建议吗?
我注意到Windows 2003 的修补程序解决了这个问题。因此,我想知道 2008 R2 是否已经修复了这个问题。我找不到任何证据表明 Windows 2008 R2 仍然存在问题,但缺乏证据比有相反的具体陈述更令人不安。
A相关问题涵盖了类似的内容,但没有讨论 Windows 2008。
答案1
重新启动服务将会吸收系统环境变量的改变。
检查方法:使用 SysInternals进程探索器在更改/添加系统环境变量并重新启动服务之前和之后检查服务进程的环境。注意:在 procexp.exe 上使用“以管理员身份运行”可查看系统进程的所有属性。
答案2
当然。任何进程都会看到环境变量,就像进程启动时一样。它基本上会得到一份副本。
因此,如果您需要它们由服务接收 - 请重新启动服务。如果您需要它们由 Windows 接收,请重新启动 Windows。
尤其是因为本地系统帐户保留了此副本;)所以 - 不。这仍然适用。我通常会说更改这是一个“接近零优先级”的项目,因为这种更改非常罕见。
答案3
@Brian 的回答并未涵盖所有用例。就我而言,我将 Windows 7 x64 计算机上的 Java 从版本 7 升级到了版本 8。之后,依赖于 Java 的服务无法启动(“net start SymmetricDS”),因为系统找不到 Java 可执行文件。
即 services.exe(所有 LocalSystem 服务的父进程)本身不会获取环境变量的更改。它只对新生成的子进程进行获取。我已通过使用 SysInternals Process Explorer 查看确认了这一点。证明:http://workblog.pilin.name/2013/03/service-environment-variables.html。没有说适用于哪个版本的Windows,但是发布日期比较新,所以我认为它适用于Windows 7和Windows Server 2008。
通过在 services.exe 中包含的旧 PATH 中的一个文件夹中创建指向 Java 可执行文件的符号链接解决了该问题。
答案4
可能通过运行时恶意攻击实现。否则只能通过重启。
刚刚验证了可以使用 Cygwin GDB 更改环境变量。已尝试使用 x86 Cygwin 和 x86 Winword。已使用 ProcExp.exe 验证。
微软表示这不是常规的做法: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682009(v=vs.85).aspx
在进程创建期间更改子进程的环境变量是进程直接更改另一个进程的环境变量的唯一方法。进程永远不能直接更改非子进程的其他进程的环境变量。
我之前的编辑:
我最好的猜测是:服务需要重新启动。至少。
进程在创建时将从其父进程继承环境变量。(http://msdn.microsoft.com/en-us/library/windows/desktop/ms682653(v=vs.85).aspx)
因此:必须重新启动该过程,并且必须有一些东西可供其继承。
如何检查
使用 ProcExp.exe 自行检查。(http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx)双击您感兴趣的流程,然后选择“环境”选项卡。
要找到父级,请双击子级,选择“图像”选项卡并读取“父级:”行。
沿着遗产线一直重复。