17370845950

C#怎么读写注册表 C# Registry类操作方法
C#通过Microsoft.Win32.Registry类操作Windows注册表,支持五大根键(如CurrentUser、LocalMachine),常用OpenSubKey/GetValue读取、CreateSubKey/SetValue写入,需注意权限、路径存在性及值类型指定。

在C#中读写Windows注册表,主要通过 Microsoft.Win32.Registry 类及其子类(如 RegistryKey)完成。它封装了对注册表HKEY根键的访问,支持本地和远程注册表操作(需权限),但默认仅限本机。

常用注册表根键对应关系

Windows注册表有五大预定义根键,C#中用静态属性表示:

  • Registry.ClassesRoot → HKEY_CLASSES_ROOT(文件关联、COM信息)
  • Registry.CurrentUser → HKEY_CURRENT_USER(当前用户配置,最常用)
  • Registry.LocalMachine → HKEY_LOCAL_MACHINE(本机全局设置,需管理员权限)
  • Registry.Users → HKEY_USERS(所有用户配置)
  • Registry.CurrentConfig → HKEY_CURRENT_CONFIG(当前硬件配置)

读取注册表值(GetValue)

使用 OpenSubKey() 获取子键,再用 GetValue() 读取具体值。注意:路径不区分大小写,但必须存在,否则返回 null 或抛异常。

// 示例:读取当前用户的桌面背景路径
using Microsoft.Win32;

var key = Registry.CurrentUser.OpenSubKey(@"Control Panel\Desktop");
if (key != null)
{
    object value = key.GetValue("Wallpaper"); // 返回 object,需自行转换
    string wallpaperPath = value?.ToString() ?? "";
    key.Close();
}

✅ 小提示:建议用 GetValue(name, defaultValue) 避免空值判断;读取前检查键是否存在,或用 try/catch 处理访问拒绝(如无权限读 HKLM)。

写入注册表值(SetValue)

写入需确保目标键可写(如 HKCU 默认可写,HKLM 通常需管理员权限)。使用 CreateSubKey() 创建或打开键,再调用 SetValue()

// 示例:在当前用户下保存程序版本
var key = Registry.CurrentUser.CreateSubKey(@"Software\MyApp");
if (key != null)
{
    key.SetValue("Version", "2.1.0", RegistryValueKind.String);
    key.SetValue("InstallTime", DateTime.Now.ToString(), RegistryValueKind.String);
    key.Close();
}
  • RegistryValueKind 可指定值类型(String、DWord、QWord、Binary、MultiString等),不指定则自动推断(但推荐显式声明)
  • 写入 HKLM 时,若程序未以管理员身份运行,会静默失败或抛 UnauthorizedAccessException
  • 删除键用 DeleteSubKey()DeleteSubKeyTree()(含子项)

权限与安全注意事项

注册表操作受UAC和权限策略严格限制:

  • 普通用户默认只能读写 HKEY_CURRENT_USER 大部分路径
  • 修改 HKEY_LOCAL_MACHINE 通常需管理员权限,发布应用前应提示提权或改用用户级存储
  • 避免硬编码深层路径,优先使用已知稳定位置(如 SOFTWARE\Vendor\App
  • 注册表不是数据库,不适合存大量数据或频繁读写;敏感信息(密码)不应明文存注册表

基本上就这些。掌握 OpenSubKey / CreateSubKey + GetValue / SetValue 这四步,就能覆盖绝大多数注册表操作场景。