利用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
regVersion = Registry.CurrentUser.OpenSubKey(keyValue, False)
Dim intVersion As Integer = 0
If (Not regVersion Is Nothing) Then
intVersion = regVersion.GetValue("Version", 0)
regVersion.Close()
End If
接下来的例子是从HKEY_CURRENT_USER中读取,增加,并写入一个DWORD值:
Imports Microsoft.Win32
Dim regVersion As RegistryKey
regVersion =
Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\TestApp\\1.0", True)
If regVersion Is Nothing Then
' Key doesn't exist; create it.
regVersion =
Registry.CurrentUser.CreateSubKey("SOFTWARE\\Microsoft\\TestApp\\1.0")
End If
Dim intVersion As Integer = 0
If (Not regVersion Is Nothing) Then
intVersion = regVersion.GetValue("Version", 0)
intVersion = intVersion + 1
regVersion.SetValue("Version", intVersion)
regVersion.Close()
End If
权限
System.Security.Permission命名空间中的RegistryPermission类操纵着访问注册表变量的能力。Registry变量存储在那些只有RegistryPermission的代码才能访问到的内存区域。类似的,当授予权限时只给它们能完成任务的最小的权限。参见RegistryPermission 和 System.Security.Permissions。
注册表访问权限值是由RegistryPermissionAccess枚举定义的,参见RegistryPermissionAccess获得更多信息,下表只列出其成员。
Value
Description
AllAccess
创建、读取和写入注册表变量的权限。
Create
创建注册表变量的权限。
NoAccess
不能访问注册表。
Read
读取注册表变量的权限。
Write
写入注册表变量的权限。
注意:如果你需要一些权限组合的话,例如你需要读写而不需要新建权限,你可以使用下面的位运算符,如下例:
RegistryPermissionAccess.Write Or RegistryPermissionAccess.Read _
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\TestApp"
使用注册表编辑器访问注册表
当你在配置你的工程时,你可能要用到注册表编辑器来对目标计算机的注册表添加键值。可参考Registry Editor获得更多信息。
访问注册表编辑器:
1、打开一个配置工程。
2、找到View菜单,指向Editor,然后点击Registry。
在配置工程中使用注册表可参考Registry Settings Management in Deployment。
结论:
注册表是一个存储应用程序信息和用户个人设置的理想位置,可以通过注册表来检查与你的程序正在交互的系统硬件或程序的信息。
大多数情况下,通过VB.NET运行时函数访问注册表就足够了,然而有时候你可能会用到.NET框架的Registry和RegistryKey类。这两种访问注册表的方法都很简单,但是这种方法有安全问题,必须小心谨慎,例如你不能在某个键中包含明文密码或其它的
……