我有一个C#应用程序,当运行设置一些环境变量。 这些环境变量需要在系统范围内设置。Windows环境变量扩展:管理员与非管理员
我使用此代码来实际执行该设置。
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%; set命令显示PATH = C:\ Windows \ System32; Foo ;.
然后我注销并重新打开。然后,我以普通用户身份运行cmd。 我键入set,它显示新的环境变量,但没有展开。它显示PATH = C:\ Windows \ System32;%ALLFOO%; (出于某种原因,扩展%SYSTEMROOT%似乎没有问题。)
我得知注销并重新启动会导致新的Explorer.exe启动以获取常规用户cmd的新env vars。 exe,但我不明白他们为什么没有扩大。
为什么要运行cmd并设置为管理员显示完全展开的环境变量并运行cmd并设置为普通用户不会?
当在C#程序中设置env vars时,我使用RegistryValueKind.ExpandString枚举。
编辑: 我知道声明时间顺序与系统变量的扩展时间问题,并编辑了问题示例以反映这一点。