如何在C#中永久设置环境变量

Kra*_*ime 9 c# environment-variables

我使用以下代码来获取和设置环境变量.

public static string Get( string name, bool ExpandVariables=true ) {
    if ( ExpandVariables ) {
        return System.Environment.GetEnvironmentVariable( name );
    } else {
        return (string)Microsoft.Win32.Registry.LocalMachine.OpenSubKey( @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment\" ).GetValue( name, "", Microsoft.Win32.RegistryValueOptions.DoNotExpandEnvironmentNames );
    }
}

public static void Set( string name, string value ) {
    System.Environment.SetEnvironmentVariable( name, value );
}
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,即使程序以管理员身份运行,只要程序运行,环境变量就会持续存在.我已经通过在上一个实例中设置的变量运行Get来确认了这一点.

上面的示例用法

Set("OPENSSL_CONF", @"c:\openssl\openssl.cfg");
Run Code Online (Sandbox Code Playgroud)

并检索

MessageBox.Show( Get("OPENSSL_CONF") );
Run Code Online (Sandbox Code Playgroud)

程序运行时,使用后Set,使用Get没有任何问题返回值.问题是环境变量不是永久性的(在系统上设置).

它也永远不会出现在高级属性下.

提前致谢.

Yuv*_*kov 15

在程序运行时,使用Set后,使用Get返回值,没有任何问题.问题是环境变量不是永久性的(在系统上设置).

那是因为SetEnvironmentVariable您在过程变量中使用存储的过载.来自文档:

调用此方法等效于使用值为EnvironmentVariableTarget.Process的目标参数调用SetEnvironmentVariable(String,String,EnvironmentVariableTarget)重载.

您需要使用重载指定EnvironmentVariableTarget.Machine:

public static void Set(string name, string value) 
{
    Environment.SetEnvironmentVariable(name, value, EnvironmentVariableTarget.Machine);
}
Run Code Online (Sandbox Code Playgroud)