Estoy usando el siguiente código para obtener y establecer las variables de entorno.

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 );
}

El problema al que me enfrento, es que incluso cuando se está ejecutando el programa como administrador, la variable de entorno dura sólo mientras se ejecuta el programa. Me han confirmado que esta ejecutando un Get en la variable I situado en una instancia anterior.

De uso de ejemplo de arriba

Set("OPENSSL_CONF", @"c:\openssl\openssl.cfg");

Y recuperar

MessageBox.Show( Get("OPENSSL_CONF") );

Mientras se ejecuta el programa, después de usar Set, el valor se devuelve mediante Get sin ningún problema. El problema es que la variable de entorno no es permanente (se establecen en el sistema).

También nunca se muestra en propiedades avanzadas.

Gracias de antemano.

  • Para hacer de ellos persisten, es necesario establecer la variable de sistema, en la actualidad son solo proceso de ajuste variable específica, que están obligados a existir sólo durante la duración del programa
  • Si se acaba de ir a buscar la variable de registro para establecer la variable de entorno, entonces ¿por qué no usar directamente, ¿por qué usted desea establecer como variable de Entorno en absoluto. Tendría sentido sólo cuando se dinámicamente la configuración de las cosas (registro de cosas es casi estático) y quiere que persisten más allá. También lo que después de la creación del registro de cambio de valor ?
InformationsquelleAutor Kraang Prime | 2015-06-09

4 Comentarios

  1. 15

    Mientras se ejecuta el programa, después de que el uso de Set, el valor es devuelto
    utilizando Obtener sin ningún problema. El problema es que la variable de entorno
    no es permanente (se establecen en el sistema).

    Eso es porque la sobrecarga de SetEnvironmentVariable que se esté usando, tiendas en el proceso variables. Desde el docs:

    De llamar a este método es equivalente a llamar a la
    SetEnvironmentVariable(String, String, EnvironmentVariableTarget)
    la sobrecarga con un valor de EnvironmentVariableTarget.Proceso de para la
    objetivo argumento.

    Que usted necesita para utilizar la sobrecarga de la especificación de EnvironmentVariableTarget.Máquina lugar:

    public static void Set(string name, string value) 
    {
        Environment.SetEnvironmentVariable(name, value, EnvironmentVariableTarget.Machine);
    }
  2. 1

    Este tipo de pregunta ya ha sido pedido varias veces, compruebe los siguientes enlaces para obtener más información:

    Establecer Variable Env – 1

    Establecer Variable Env – 2

    Conjunto De Env Variable – Tutorial

    • Recuerde también que, Env variables son siempre heredado en el proceso de inicio, por lo que no se puede Obtener cuando el proceso ya está encendido , esto necesita reiniciar
    • no sé por qué ninguno de los resultados aparecieron cuando busco aquí, de google, y en el ‘auto’ búsqueda al escribir el artículo. epic 3 x fail para los motores de búsqueda 😉
  3. 0

    Aquí un ejemplo en el que permanentemente se actualiza la RUTA de acceso de Usuario variable mediante programación la edición del registro:

    //Admin Permission not-required:
    //     HKCU\Environment\Path
    //Admin Permission required:
    //     HKLM\SYSTEM\CurrentControlSet\Control
    //        \Session Manager\Environment\Path
    public static void UserPathAppend(string path, int verbose=1) {
    string oldpath = UserPathGet();
    List<string> newpathlist = oldpath.Split(';').ToList();
    newpathlist.Add(path);
    string newpath = String.Join(";", newpathlist.ToArray());
    UserPathSet(newpath);
    UpdateEnvPath();
    if (verbose!=0) {
    System.Windows.MessageBox.Show(
    "PATH APPEND:\n\n"
    + path + "\n\n"
    + "OLD HKCU PATH:\n\n"
    +  oldpath + "\n\n"
    + "NEW HKCU PATH:\n\n"
    +  newpath + "\n\n"
    + "REGISTRY KEY MODIFIED:\n\n"
    + "HKCU\\Environment\\Path\n\n"
    + "NOTE:\n\n"
    + "'Command Path' is a concat of 'HKLM Path' & 'HKCU Path'.\n",
    "Updated Current User Path Environment Variable"
    );
    }
    }
    public static void UserPathPrepend(string path, int verbose=1) {
    string oldpath = UserPathGet();
    List<string> newpathlist = oldpath.Split(';').ToList();
    newpathlist.Insert(0, path);
    string newpath = String.Join(";", newpathlist.ToArray());
    UserPathSet(newpath);
    UpdateEnvPath();
    if (verbose != 0) {
    System.Windows.MessageBox.Show(
    "PATH PREPEND:\n\n"
    + path + "\n\n"
    + "OLD HKCU PATH:\n\n"
    +  oldpath + "\n\n"
    + "NEW HKCU PATH:\n\n"
    +  newpath + "\n\n"
    + "REGISTRY KEY MODIFIED:\n\n"
    + "HKCU\\Environment\\Path\n\n"
    + "NOTE:\n\n"
    + "'Command Path' is a concat of 'HKLM Path' & 'HKCU Path'.\n",
    "Updated Current User Path Environment Variable"
    );
    }
    }
    public static string UserPathGet()
    {
    //Reads Registry Path "HKCU\Environment\Path"
    string subKey = "Environment";
    Microsoft.Win32.RegistryKey sk = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(subKey);
    if (sk == null)
    return null;
    else
    return sk.GetValue("Path").ToString();
    }
    public static void UserPathSet(string newpath)
    {
    //Writes Registry Path "HKCU\Environment\Path"
    string subKey = "Environment";
    Microsoft.Win32.RegistryKey sk1 = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(subKey);
    sk1.SetValue("Path", newpath);
    }
    //===========================================================
    //Private: This part required if you don't want to logout 
    //         and login again to see Path Variable update
    //===========================================================
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern IntPtr SendMessageTimeout(IntPtr hWnd, 
    uint Msg, UIntPtr wParam, string lParam, 
    SendMessageTimeoutFlags fuFlags, 
    uint uTimeout, out UIntPtr lpdwResult);
    private enum SendMessageTimeoutFlags : uint
    {
    SMTO_NORMAL = 0x0, SMTO_BLOCK = 0x1, 
    SMTO_ABORTIFHUNG = 0x2, SMTO_NOTIMEOUTIFNOTHUNG = 0x8
    }
    private static void UpdateEnvPath() {
    //SEE: https://support.microsoft.com/en-us/help/104011/how-to-propagate-environment-variables-to-the-system
    //Need to send WM_SETTINGCHANGE Message to 
    //   propagage changes to Path env from registry
    IntPtr HWND_BROADCAST = (IntPtr)0xffff;
    const UInt32 WM_SETTINGCHANGE = 0x001A;
    UIntPtr result;
    IntPtr settingResult
    = SendMessageTimeout(HWND_BROADCAST,
    WM_SETTINGCHANGE, (UIntPtr)0,
    "Environment",
    SendMessageTimeoutFlags.SMTO_ABORTIFHUNG,
    5000, out result);
    }

Dejar respuesta

Please enter your comment!
Please enter your name here