目录
1.注册表
注册表的层次结构非常类似于文件系统。查看和修改注册表内容的一般方式是使用regedit或regedt32工具。
在注册表中,最上面的节点是注册的根键,它们的位置是不能改变的。系统共有7个根键,但使用regedit只能看到其中的5个:
- HKEY_CLASSES_ROOT(HKCR):包含系统上文件类型的细节(.txt、.doc等),以及应用程序可以打开的文件类型。它还包含所有COM组件的注册信息。
- HKEY_CURRENT_USER(HKCU):包含用户目前登录的机器的设置。这些设置包括桌面设置、环境变量、网络和打印机连接,以及其他定义用户操作环境的设置。
- HKEY_LOCAL_MACHINE(HKLM):包含所有安装到机器上的软件和硬件信息,这些设置不是用户特有的,而是可用于所有登录到机器上的用户所共享。它还包含HKCR根键:HKCR实际上并不是一个独立的根键,而只是一个对注册表键HKLM/SOFTWARE/Classes的映射。
- HKEY_USERS(HKUSR):包含所有用户的配置。它还包含HKCU根项,HKCU根项是对HKEY_ USERS中一个键的映射。
- HKEY_CURRENT_ CONFIG(HKCF):包含机器上的硬件配置信息。
每个注册表键都类似于文件系统中的文件夹或文件。但是,文件系统可以区分文件(文件中包含数据)和文件夹(其中主要包含其他文件夹或文件),而注册表中只有键。键可以包含数据和其他的键。
如果键中包含数据,这个键就表示为一组值。每个值都有一个相关的名称、数据类型和数据,另外,键还可以有默认值。键的数据类型分别为:
- REG_SZ:字符串类型
- REG DWORD:无符号的32位整数
- REG BINARY:字节类型
应用程序会在注册表中创建许多键以存储数据,通常把它们存储在键HKLM\Software\<CompanyName>中。
2.注册表类
RegistryKey 类
https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.win32.registrykey?view=netcore-3.1
属性
Name | 检索项的名称。 |
SubKeyCount | 检索当前项的子项计数。 |
ValueCount | 检索项中值的计数。 |
View | 获取用于创建注册表项的视图。 |
方法
Close() | 关闭该项,如果其内容已修改,则将其刷新到磁盘。 |
CreateSubKey(String) | 创建一个新子项或打开一个现有子项以进行写访问。 |
DeleteSubKey(String) | 删除指定子项。 |
DeleteSubKeyTree(String) | 递归删除子项和任何子级子项。 |
DeleteValue(String) | 从此项中删除指定值。 |
DeleteValue(String, Boolean) | 从此项中删除指定的值,并指定在找不到该值时是否引发异常。 |
GetAccessControl() | 返回当前注册表项的访问控制安全性。 |
GetSubKeyNames() | 检索包含所有子项名称的字符串数组。 |
GetValue(String) | 检索与指定名称关联的值。 如果注册表中不存在名称/值对,则返回 |
GetValueKind(String) | 检索与指定名称关联的值的注册表数据类型。 |
GetValueNames() | 检索包含与此项关联的所有值名称的字符串数组。 |
OpenSubKey(String) | 以只读方式检索子项。 |
SetAccessControl(RegistrySecurity) | 向现有注册表项应用 Windows 访问控制安全性。 |
SetValue(String, Object) | 设置指定的名称/值对。 |
Registry 类
https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.win32.registry?view=netcore-3.1
Registry类只能对注册表键进行单一的访问,执行简单的操作。Registry的另一个作用是提供表示根键的RegistryKey实例,以便在注册表中浏览。Registry是通过静态属性来提供这些实例的,这样的属性共有7个:
字段
ClassesRoot | 定义文档的类型(或类)以及与那些类型关联的属性。 该字段读取 Windows 注册表基项 HKEY_CLASSES_ROOT。 |
CurrentConfig | 包含有关非用户特定的硬件的配置信息。 该字段读取 Windows 注册表基项 HKEY_CURRENT_CONFIG。 |
CurrentUser | 包含有关当前用户首选项的信息。 此字段读取 Windows 注册表基项 HKEY_CURRENT_USER。 |
LocalMachine | 包含本地计算机的配置数据。 该字段读取 Windows 注册表基项 HKEY_LOCAL_MACHINE。 |
PerformanceData | 包含软件组件的性能信息。 该字段读取 Windows 注册表基项 HKEY_PERFORMANCE_DATA。 |
Users | 包含有关默认用户配置的信息。 该字段读取 Windows 注册表基项 HKEY_USERS。 |
方法
GetValue(String, String, Object) | 检索与指定的注册表项中的指定名称关联的值。 如果在指定的项中未找到该名称,则返回您提供的默认值;或者,如果指定的项不存在,则返回 |
SetValue(String, String, Object) | 设置指定的注册表项的指定名称/值对。 如果指定的项不存在,则创建该项。 |
SetValue(String, String, Object, RegistryValueKind) | 通过使用指定的注册表数据类型,设置该指定的注册表项的名称/值对。 如果指定的项不存在,则创建该项。 |
例如,要获得一个表示HKLM键的RegistryKey对象,可以使用如下形式的代码:
Dim hklm As RegistryKey =Registry.LocaIMachine
Registry类没有供用户使用的公共构造函数,也没有可以直接通过键的名称来访问键的方法。如果要打开给定位置上的一个注册表键,唯一的方式是从Registry的静态属性开始向下浏览各个键。例如,要读取HKLM/Software/Microsoft键中的一些数据,可以使用下面的代码:
Dim hklm As RegistryKey = Registry.LocalMachine
Dim hkSonware As RegistryKey = hklm.OpenSubKey("Software")
Dim hkMicrosoft As RegistryKey = hkSortware.OpenSubKey("Microsoft")
以这种方式访问注册表键是只读的。如果要向该键写入(包括写入其值,或创建和删除其子键),就需要使用另一个重载版本的OpenSubKey()方法,该方法使用Boolean类型参数表示是否要对该键进行读写访问。例如,下面的代码以读写方式打开HKLM\Software/Microsoft键:
Dim hklm As RegistryKey=Registry.LocalMachine
Dim hkSortware As RegistryKey=hklm.OpenSubKey("Software")
Dim hkMicrosoft As RegistryKey= hkSortware.OpenSubKey("Microsoft", True)
如果指定的键不存在,则OpenSubKey()方法会返回空Nothing。在创建一个键时,可以使用RegistryKey.CreateSubKey()方法,该方法会返回RegistryKey对象的引用,以提供对新创建的键的读写访问:
Dim hklm As RegistryKey = Registry.LocalMachine
Dim hkSortware As RegistryKey=hklm.OpenSubKey("Sofware")
Dim hkAtg As RegistryKey=hkSortware.CreateSubKey(¨Atg")
调用CreateSubKey()方法创建键时,如果键不存在,则会创建该键。如果键已经存在,则会返回一个表示该键的RegistryKey对象。 CreateSubKey()方法不会删除任何数据。如果要删除注册表键,则需要显式调用RegistryKey.Delete()方法,因此注册表对于Windows是非常重要的。如果删除了一些重要的键,就会中断Windows的执行,因此删除注册表键时应非常小心。
在定位要读取或修改的注册表键后,就可以使用SetValue()方法或GetValue()方法设置或获取该键中的值。这两个方法的声明如下:
GetValue(name As String) As Object
SetValue(name As String,value As Object)
在调用SetValue()方法设置键的值时,它会根据所提供的数据类型自动将其转换为相应的REG_SZ、REG_DWORD或REG_BINARY类型。例如:
Dim hkAtg As RegistryKey=hkSortware.CreateSubKey("Atg")
hkAtg.SetValue("Name¨,¨韩梅梅¨)
hkAtg.SetValue("Age",10)
这段代码设置键包含两个值:REG_SZ类型的Name和REG_DWORD类型的Age。
RegistryKey.GetValue()方法与此类似,它会返回一个对象引用,如果该方法检测到值的类型为REG_SZ,则返回一个字符串引用,如果值的类型为REG_DWORD,则返回一个Integer类型的值。
dim stringValue as string=hkatg.getvalue("Name")
dim intValue as integer=hkatg.getvalue("Age")
最后,完成了读取或修改数据操作后,应关闭键:
bkAtg.Clooe()