ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 注册表操作笔记(VB.NET)

注册表操作笔记(VB.NET)

原创 Linux操作系统 作者:iDotNetSpace 时间:2009-02-27 13:14:21 0 删除 编辑

一、基本概念

 1.项(Key):是对象(Object),称为 Microsoft.Win32.RegistryKey 对象
 2.项名(KeyName):一定是字符串,例如"HKEY_CURRENT_USER\Soft1\Stone"
 3.值(Value):各种类型,例如("String Line2", 22, &HFF, New String() {"String Line1", "String Line2", "String Line3"}, New Byte() {255, 0})
 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 的代码也能访问的内存位置。同样,在授予权限时,应授予完成任务所需的最小权限。
    4)更多信息请参阅代码访问安全性。

二、常见操作的实现方法

 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第一个参数的起始字符不要是反斜杠"\",否则引发异常,必须的父项的直接子项名,后可反斜杠隔开指定子项的子项。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-558064/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5307551