注册表完全操纵专题

一、基本概念 

        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第一个参数的起始字符不要是反斜杠"\",

          否则引发异常,必须的父项的直接子项名,后可反斜杠隔开指定子项的子项

 

 

        

 

转载于:https://www.cnblogs.com/nowthink/archive/2010/11/12/Registry.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值