簡體   English   中英

如何在C#中設置系統環境變量?

[英]How to set system environment variable in C#?

我試圖在我的應用程序中設置一個系統環境變量,但得到一個SecurityException 我測試了我在谷歌中找到的所有內容 - 沒有成功。 這是我的代碼(注意,我是我的電腦的管理員並以管理員身份運行 VS2012):

嘗試 1

new EnvironmentPermission(EnvironmentPermissionAccess.Write, "TEST1").Demand();
Environment.SetEnvironmentVariable("TEST1", "MyTest", EnvironmentVariableTarget.Machine);

嘗試 2

new EnvironmentPermission(EnvironmentPermissionAccess.Write, "TEST1").Demand();

using (var envKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", true))
{

  Contract.Assert(envKey != null, @"HKLM\System\CurrentControlSet\Control\Session Manager\Environment is missing!");
  envKey.SetValue("TEST1", "TestValue");
}

嘗試 3此外,我還嘗試使用管理員權限來安裝我的應用程序

您還有其他建議嗎?

文檔告訴您如何執行此操作。

調用SetEnvironmentVariable對系統環境變量沒有影響。 要以編程方式添加或修改系統環境變量,請將它們添加到HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Session Manager\\Environment注冊表項,然后廣播WM_SETTINGCHANGE消息,其中lParam設置為字符串"Environment" 這允許應用程序(例如 shell)獲取您的更新。

因此,您需要寫入您已經嘗試寫入的注冊表設置。 然后廣播WM_SETTINGCHANGE消息,如上所述。 您需要以更高的權限運行才能成功。

一些示例代碼:

using Microsoft.Win32;
using System;
using System.Diagnostics.Contracts;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        const int HWND_BROADCAST = 0xffff;
        const uint WM_SETTINGCHANGE = 0x001a;

        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern bool SendNotifyMessage(IntPtr hWnd, uint Msg, 
            UIntPtr wParam, string lParam);

        static void Main(string[] args)
        {
            using (var envKey = Registry.LocalMachine.OpenSubKey(
                @"SYSTEM\CurrentControlSet\Control\Session Manager\Environment",
                true))
            {
                Contract.Assert(envKey != null, @"registry key is missing!");
                envKey.SetValue("TEST1", "TestValue");
                SendNotifyMessage((IntPtr)HWND_BROADCAST, WM_SETTINGCHANGE,
                    (UIntPtr)0, "Environment");
            }
        }
    }
}

然而,雖然此代碼確實有效,但 .net 框架提供了更簡單地執行相同任務的功能。

Environment.SetEnvironmentVariable("TEST1", "TestValue", 
    EnvironmentVariableTarget.Machine);

三個參數Environment.SetEnvironmentVariable重載的文檔說:

如果目標是 EnvironmentVariableTarget.Machine,則環境變量存儲在本地計算機注冊表的 HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Session Manager\\Environment 鍵中。 它還會復制到文件資源管理器的所有實例。 然后,從文件資源管理器啟動的任何新進程都會繼承環境變量。

如果目標是用戶或機器,則通過 Windows WM_SETTINGCHANGE 消息通知其他應用程序設置操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM