我有一個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枚舉。
編輯: 我知道聲明時間順序與系統變量的擴展時間問題,並編輯了問題示例以反映這一點。