[英]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");
}
您還有其他建議嗎?
該文檔告訴您如何執行此操作。
調用
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.