一、基本概念
1.项(Key):是对象(Object),称为Microsoft.Win32.RegistryKey 对象;
2.项名(KeyName):一定是字符串,例如"HKEY_CURRENT_USER\Soft1\Stone";
3.值(Value):各种类型;
4.值名(ValueName):一定是字符串,例如("Hate1", "Hate2", "Hate3");
5.键值类型:
1)字符串值(REG_SZ):对应.Net类型System.String
2)二进制值(REG_BINARY):对应.Net类型System.Byte(),字节数组
3)DWORD值(REG_DWORD):32位的,对应.Net类型System.Int32或VB类型Integer
4)QWORD值(REG_QWORD):64位的,对应.Net类型System.Int64或VB类型Long
5)多字符串值(REG_MULTI_SZ):对应.Net类型System.String(),字符串数组
6)可扩充字符串值(REG_EXPAND_SZ):对应.Net类型System.String
6.安全性和注册表权限
1)在注册表中以纯文本形式存储机密信息(例如密码)是不安全的,即使注册表项受 ACL(访问控制列表)保护。
2)任何以完全信任方式运行的代码(在默认安全策略下,指任何安装在用户的本地硬盘上的代码)都具有访问注册表的必要权限。
3)注册表变量不应存储在没有 RegistryPermission 的代码也能访问的内存位置。
同样,在授予权限时,应授予完成任务所需的最小权限。
二、常见操作的实现方法
1.读取注册表项的键值
[要点]
My.Computer.Registry 对象中的 GetValue 方法
以及Microsoft.Win32.RegistryKey 对象的 GetValue 方法可用于读取 Windows 注册表中的值。
如果项不存在,则引发异常。
如果 ValueName不存在,则返回 Nothing,当然可以设置当值不存在的返回默认值
[方法一]
My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\360Safe", "ScanDate", String.Empty)
注:此方法中如果基项名称不存在,则引发异常(如:HKEY_CURRENT_USER就是有效的基项名称),
非基项名称不存在不会引发异常,只会返回DefaultValue,本例为String.Empty
[方法二]
My.Computer.Registry.CurrentUser.OpenSubKey("Software\360Safe").GetValue("ScanDate", String.Empty)
注:方法OpenSubKey的项名(本例中为"Software\360Safe")必须存在,否则会引发异常
[特别主意]
1.读取注册表项的默认键值,请将ValueName置为String.Empty;
2.创建注册表项以及创建项下的键值
[要点]
Microsoft.Win32.RegistryKey 对象的 CreateSubKey 方法可用于创建注册表项。
如果项已经存在,也不会引发异常。
My.Computer.Registry 对象的 SetValue 方法可用于写入 Windows 注册表的值。
如果注册表值不存在,将创建注册表值,包括完整的注册表项路径。
[创建项]
My.Computer.Registry.CurrentUser.CreateSubKey("Key1\Key2\...\Keyn")
My.Computer.Registry.LocalMachine.CreateSubKey("Key1\Key2\...\Keyn")
注:此方法中如果项名称不存在,则创建新项,如果项已存在,不会引发异常
[创建键值]
1) 创建二进制键值:
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate3", New Byte() {255, 0},
Microsoft.Win32.RegistryValueKind.Binary)
或 My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate3", New Byte() {&HFF, &H0},
Microsoft.Win32.RegistryValueKind.Binary)
2) 创建字符串键值:
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate3", "Hate You!")
当然后面加上类型也没错,但是没必要,如下->
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate3", "Hate You!",
Microsoft.Win32.RegistryValueKind.String)
3) 创建DWORD(32位数字)键值:下面4种方法都可以,是一样的效果
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate1", 32)
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate2", 32,
Microsoft.Win32.RegistryValueKind.DWord)
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate3", &H20)
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate4", &H20,
Microsoft.Win32.RegistryValueKind.DWord)
4) 创建QWORD(64位数字)键值,多字符串键值和可扩充字符串键值的方法同理如下:
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate1",
New String() {"String Line1", "String Line2", "String Line3"},
Microsoft.Win32.RegistryValueKind.MultiString)
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate2", "This is a new String line.",
Microsoft.Win32.RegistryValueKind.ExpandString)
My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Soft1\Stone", "Hate3", &H20,
Microsoft.Win32.RegistryValueKind.QWord)
[特别主意]
1.写入注册表项的默认键值,请将ValueName置为String.Empty;
2.二进制键值请使用字节数组,多字符串键值请使用字符串数组。
3.修改注册表项的键值
(修改键值同设置键值,也是同样的使用SetValue方法)
4.删除注册表项以及删除注册表项下的键值
[要点]
Microsoft.Win32.RegistryKey 对象的 DeleteSubKey 方法可用于删除指定的子项。
字符串 SubKey不区分大小写。
Microsoft.Win32.RegistryKey 对象的 DeleteSubKeyTree 方法可用于递归删除子项和任何子级子项。
字符串 Subkey 不区分大小写。
Microsoft.Win32.RegistryKey 对象的 DeleteValue 方法可用于从此项中删除指定值。
[删除叶子子项]
My.Computer.Registry.CurrentUser.DeleteSubKey("Key1\Key2\...\Keyn", False)
注:此方法中如果叶子子项不存在,则根据此方法的第二个参数确定是否引发异常,True引发,False不引发
[删除主干子项]
My.Computer.Registry.CurrentUser.DeleteSubKeyTree("Key1\Key2")
注:你使用此方法删除叶子子项也是可以的
[删除键值]
My.Computer.Registry.CurrentUser.OpenSubKey("Stone\Special", True).DeleteValue("ValueName1", False)
注:你使用此方法删除叶子子项也是可以的
[特别主意]
1.对于使用OpenSubKey方法打开的注册表项必须在OpenSubKey的第二个参数中使用True来指定具有写权限才可以做删除动作;
2.要删除注册表项的默认键值,请将ValueName置为String.Empty,前提是事前有设置过该注册表项的默认值,
否则就会引发异常。删除默认键值只会清除默认键的值,默认键不会消失,如下图:
3.非默认键值删除前后又是怎么样的,请看下面的对比图:
5.枚举注册表项下所有子项和枚举项下所有键值
[要点]
Microsoft.Win32.RegistryKey 对象的 GetSubKeyNames 方法可用于检索包含于此项下所有子项名称的字符串数组。
Microsoft.Win32.RegistryKey 对象的 GetValueNames 方法可用于检索包含与此项关联的所有值名称的字符串数组。
[枚举子项]
Me.ComboBox1.DataSource =
My.Computer.Registry.CurrentUser.GetSubKeyNames()
Me.ComboBox1.DataSource =
My.Computer.Registry.CurrentUser.OpenSubKey("Software\ACD Systems", False).GetSubKeyNames
注:此方法中如果项不存在,则引发异常
[枚举键值]
Me.ComboBox1.DataSource =
My.Computer.Registry.CurrentUser.OpenSubKey("Software\ACD Systems\ACDSee\110", False).GetValueNames
注:OpenSubKey第一个参数的起始字符不要是反斜杠"\",
否则引发异常,必须的父项的直接子项名,后可反斜杠隔开指定子项的子项