【发布时间】:2017-02-21 20:48:13
【问题描述】:
我有一个 C# 应用程序,它在运行时会设置一些环境变量。 这些环境变量需要在系统范围内设置。
我使用这段代码来实际做设置。
public static void SetEnvironmentVariable(string _keyName, string _value, RegistryValueKind _type)
{
using (RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", true))
{
if (reg != null)
{
reg.SetValue(_keyName, _value, _type);
}
else
{
string x =
string.Format(
"Could find registry key that hosts Environment Variables: SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment");
App.AppLogger.Error(x);
throw new Exception(x);
}
}
}
此代码有效,但我注意到一些奇怪的行为。 运行我的应用程序和此代码后,我立即以普通用户身份运行 cmd 并使用“set”命令查看环境。 它没有显示任何变化。
然后我以管理员身份运行 cmd 提示符并运行 set。它显示了变化。不仅如此,它还显示了完全扩展的变量。其中ALLFOO=Foo,PATH=C:\Windows\System32;%ALLFOO%;,设置命令显示PATH=C:\Windows\System32;Foo;。
然后我注销并重新登录。然后我以普通用户身份运行 cmd 。 我输入 set ,它显示了新的环境变量,但没有展开。 它显示 PATH=C:\Windows\System32;%ALLFOO%; (由于某种原因,扩展 %SYSTEMROOT% 似乎没有问题。)
我知道注销并重新启动会导致启动的新 Explorer.exe 为普通用户的 cmd.exe 获取新的环境变量,但我不明白为什么它们没有被扩展。
为什么以管理员身份运行 cmd 会显示完全展开的环境变量,而以普通用户身份运行 cmd 和设置却不会?
在 C# 程序中设置环境变量时,我使用 RegistryValueKind.ExpandString 枚举。
编辑: 我知道系统变量的声明时间到扩展时间问题的顺序,并编辑了问题示例以反映这一点。
【问题讨论】: