使用VB/C#操作注册表添加值、获取权限及访问其他用户注册表问题
Windows注册表VB/C#操作问题解决方案
问题1:向指定注册表键添加键值项的实现方法
添加键值项不需要使用CreateSubKey方法,该方法仅用于创建子键,新增/修改键值项使用SetValue方法即可,操作步骤如下:
- 首先从对应注册表基项(如
Registry.Users、Registry.LocalMachine等)以可写权限打开目标子键 - 调用子键实例的
SetValue方法写入键值,如对应键值不存在则自动新增,存在则覆盖原有值 - 操作完成后释放注册表键资源(推荐用
using语句自动释放)
C# 示例代码
using Microsoft.Win32; // 第二个参数为true表示获取可写权限 using (RegistryKey targetKey = Registry.Users.OpenSubKey(@".DEFAULT\Control Panel\International", true)) { if (targetKey != null) { // 写入字符串类型键值 targetKey.SetValue("CustomString", "测试值", RegistryValueKind.String); // 写入DWORD类型键值 targetKey.SetValue("CustomDword", 1001, RegistryValueKind.DWord); } }
VB 示例代码
Imports Microsoft.Win32 ' 第二个参数为True表示获取可写权限 Using targetKey As RegistryKey = Registry.Users.OpenSubKey(".DEFAULT\Control Panel\International", True) If targetKey IsNot Nothing Then ' 写入字符串类型键值 targetKey.SetValue("CustomString", "测试值", RegistryValueKind.String) ' 写入DWORD类型键值 targetKey.SetValue("CustomDword", 1001, RegistryValueKind.DWord) End If End Using
问题2:访问HKEY_USERS下其他用户注册表项的解决方法
报错的核心原因是默认进程权限不足,且未加载/获取其他用户注册表的操作权限,无需手动以管理员身份登录系统,按以下步骤操作即可:
- 首先配置程序自动提权:在项目的
app.manifest配置文件中,修改requestedExecutionLevel节点为如下内容,程序运行时会自动触发UAC提权:<requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> - 再根据目标用户的状态选择对应操作:
- 若目标用户未登录:其他用户的注册表默认存储在对应用户目录的
NTUSER.DAT文件中,需要调用Win32 APIRegLoadKey将该文件加载到HKEY_USERS的自定义子节点下,操作完成后必须调用RegUnLoadKey卸载配置单元,避免影响用户后续登录。 - 若目标用户已登录:对应用户的注册表已加载在HKEY_USERS下以用户SID命名的子节点中,只需先修改目标注册表项的访问控制列表(ACL),给当前管理员账号添加完全控制权限,即可正常执行写入操作。
- 若目标用户未登录:其他用户的注册表默认存储在对应用户目录的
权限修改C#示例(适用于已登录用户)
using System.Security.AccessControl; using System.Security.Principal; using Microsoft.Win32; // 替换为目标用户的实际SID string targetUserSid = "S-1-5-21-123456789-1234567890-1234567890-1001"; using (RegistryKey userRootKey = Registry.Users.OpenSubKey( targetUserSid, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.ChangePermissions | RegistryRights.WriteKey)) { if (userRootKey != null) { // 给当前管理员账号添加完全控制权限 RegistrySecurity acl = userRootKey.GetAccessControl(); SecurityIdentifier currentAdmin = WindowsIdentity.GetCurrent().Owner; RegistryAccessRule accessRule = new RegistryAccessRule( currentAdmin, RegistryRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow); acl.AddAccessRule(accessRule); userRootKey.SetAccessControl(acl); // 权限修改完成后即可正常创建子键、写入键值 userRootKey.CreateSubKey(@"Test\MySubKey"); } }
内容的提问来源于stack exchange,提问作者MHD
相关产品推荐
相关产品推荐

