У меня есть приложение C#, которое при запуске задает некоторые переменные среды. Эти переменные среды должны быть установлены в системном масштабе.Расширение переменной среды Windows: Admin vs Non-Admin
Я использую этот код, чтобы на самом деле сделать набор.
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 как admin и запускаю set. Он показывает изменения. Мало того, он показывает полностью расширенные переменные. Где ALLFOO = Foo и PATH = C: \ Windows \ System32;% ALLFOO% ;, команда set показывает PATH = C: \ Windows \ System32; Foo ;.
Затем я выхожу и снова включаюсь. Затем я запускаю cmd как обычный пользователь. I type set, и он показывает новые переменные среды, но не расширен. Показывает PATH = C: \ Windows \ System32;% ALLFOO%; (По какой-то причине, по-видимому, нет проблем с расширением% SYSTEMROOT%.)
Я получаю, что выход из системы и обратно приводит к запуску нового Explorer.exe, чтобы получить новые env vars для CMD обычного пользователя. exe, но я не понимаю, почему они не расширены.
Зачем запускать cmd и устанавливать как администратор показывать полностью расширенные переменные среды и запускать cmd и устанавливать как обычный пользователь, не так ли?
При настройке env vars в программе C# я использую перечисление RegistryValueKind.ExpandString.
Редактировать: Мне известно о порядке времени объявления для времени расширения с системными переменными и отредактировал пример вопроса, чтобы отразить это.