日期:2012-10-20  浏览次数:20565 次


利用VB.NET访问注册表



译者注:访问注册表的例子比较多,然而通过VB.NET访问注册表的例子并不多,本文翻译了一篇MSDN上的利用VB.NET存取注册表的例子,挺详细也挺全面的。 ( http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchimpdragdrop.asp)

Cat Francis
Visual Studio Team
Microsoft Corporation

April 2002

摘要:这篇文章描述了利用VB.NET内置函数DeleteSetting, GetAllSettings, GetSetting 和 SaveSetting,以及通用语言运行时的两个类Registry 和 RegistryKey来存取注册表的实例,详述了所需的权限,解释了何时利用注册表编辑器,并向你展示了如何利用程序从注册表中动态的读取数据及如何写入数据。

引言

当用VB.NET进行编程时,你可能会选择用VB.NET或.NET框架中的Registry类中的函数来访问注册表。虽然大多数情况下VB.NET的内置函数足够用了,然而某些情况下你仍然需要.NET框架类来解决问题。

注册表不仅存储了本地机上一些程序的信息,还保存了操作系统的信息。操作注册表可能会有危险。因此编程时必须谨慎的查看代码,确保程序对所运行的机器上的安全不会构成威胁。

注册表入口点包括两部分:键名和键值。入口点是存储在系统中的键和子键,类似于文件系统中的目录和子目录。

必备知识

要想读懂本文需要有如下的必备知识:

1、熟悉上一个版本的Visual Basic。

2、注册表设计和利用的知识。

3、理解访问注册表的安全含义。

用VB.NET内置函数访问注册表

VB.NET提供了四个访问注册表的函数,为了使用它们,首先必须有读写权限。任何运行在全信任模式下的代码都必须有访问注册表的必要的权限。可以查看RegistryPermission类从而获得更多的信息。

VB.NET函数
描述

DeleteSetting
删除注册表中应用程序中的某项或键值

GetSetting
返回注册表中应用程序入口点的键值

GetAllSettings
返回注册表中程序入口点的一列键值

SaveSetting
在注册表中创建或保存程序的设置


注意:不能通过GetSetting函数返回某项的名字

如果无法保存某项的设置,将触发一个ArgumentException对象。参见ArgumentException可以获得更多的相关信息。

下面的例子在注册表中创建了一个主键和两个子键。首先打印主键的值,然后输出主键及其两个子键的值,然后删除第二个子键,在输出主键和第一个子键的值来确定是否删掉了第二个子键。

' Create the first key.
SaveSetting("TestApp","Startup","FirstKey","First")
' Create the first subkey.
SaveSetting("TestApp","FirstKey","FirstSubKey","FirstSub")
' Create the second subkey.
SaveSetting("TestApp","FirstKey","SecondSubKey","SecondSub")
Try
' Write the first key's value.
Console.WriteLine ((GetSetting("TestApp","Startup","FirstKey"))
' Write the first key as well as its two subkeys.
Console.WriteLine (GetAllSettings("TestApp","Startup"))
Catch e As ArgumentException
Catch e As Exception
Console.WriteLine (e.GetType.ToString)
Finally
End Try
DeleteSetting("TestApp","FirstKey","SecondSubKey")
Try
Console.WriteLine (GetSetting("TestApp","Startup","FirstKey"))
Console.WriteLine (GetAllSettings("TestApp","Startup"))
Catch e As ArgumentException
Catch e As Exception
Console.WriteLine (e.GetType.ToString)
Finally
End Try

用VB.NET内置的注册表访问函数是有限制的你只能访问到HKEY_CURRENT_USER\Software\VB and VBA Program Settings下的注册表项,而且要想访问到该项下的条目必须登录到系统,因为HKEY_CURRENT_USER主键在未登录情况下是不能访问的。

用.NET框架访问注册表

上面提到,用VB.NET内置的注册表访问函数只能访问到HKEY_CURRENT_USER\Software\VB and VBA Program Settings下的注册表项,因而应用是很有限的。这时,你可以用.NET框架的Microsoft.Win32命名空间中的Registry和RegistryKey类来访问注册表。可参见Registry和RegistryKey。



安全须知:向当前用户的注册表(Microsoft.Win32.Registry.CurrentUser)写入数据比向本地机的注册表(Microsoft.Win32.Registry.LocalMachine)写数据更安全。还有两一种情况,就是当你正在创建的键值已经被先前的另一个可能恶意的进程创建时,这就是典型的蹲坐。为了这种情况发生,用RegistryKey.GetValue方法来获得键值,当某个键不存在时该方法将返回Nothing。

Registry类提供了一些可以访问注册表主键及其子键的一些方法,基键本身是只读的。下表列出了Registry类提供的访问注册表的方法

Key
Description

ClassesRoot
定义了关联到文档和属性的类型

CurrentConfig
包含不属于特定用户的硬件配置信息

CurrentUser
包含了当前用户参数的信息,例如环境变量

DynData
包含了动态注册表数据,如某些虚拟设备驱动器所用到的数据

LocalMachine
存储了本地机的配置数据,包括五个子键Hardware, SAM, Security, Software, and System

PerformanceData
包含了软件组件的性能信息

Users
包含了默认用户参数的信息




下面的例子显示了如何从HKEY_CURRENT_USER读取一个DWORD键值:

Imports Microsoft.Win32
Dim regVersion As RegistryKey
Dim keyValue As String
keyValue = Software\\Microsoft\\TestApp\\1.0