读写注册表
1. 自window95以来的所有window版本中,注册表是包含window安装,用户爱好,以及安装软件和设备的所有配置信息的核心存储库。目前所有基于window的商业软件都是用注册表来存储这些信息。
2. 应用程序现在使用windows instanller来安装,开发人员不再需要直接操作注册表来安装应用程序了。但是,如果要发布完整的应用程序,应用程序也要使用注册表来保存配置信息。例如,如果应用程序要显示在控制面板的“添加/删除程序” 对话框中,仍然需要使用相应的注册表项。还需要使用注册表处理与原有代码的向后兼容性。
3. 注册表的库和.NET库一样复杂,它包括访问注册表的类,其中有两个类设计到注册表,即Registry和RegistryKey,这两个类都在Microsoft.Win32命名空间中。
注册表的必备知识
1.注册表的层次结构非常类似于文件系统。
2.查看和修改注册表内容的一般方式为:
regedit :所有window版本都有。
regedt32:从window NT版本开始使用,其用户友好性不如regedit,但能访问regedit不能访问的安全性信息。
在window操作系统的文本系统中,最上面的节点是驱动器盘符,如:C:,D:,在注册表中,最上面的节点是注册表表巢(registry hive),他们的位置是不能改变的,有7个表巢(但xp中只能看到其中的5个).
1.HKEY_CLASSS_ROOT(HKCR):包含系统上文件系统类型的细节(.txt,.doc等),以及应用程序可以打开的文件类型。
2.HKEY_CURRENT_USER(HKCU):包含用户目前登录的计算机的用户喜好,这些设置包括桌面设置,环境设置,网络和打印机连接和其他定义用户操作系统环境的设置。
3.HKEY_LOCAL_MACHINE(HKLM):其中包含所有安装到机器上的软件和硬件信息,这些设置不是用户特有的,而是可用于所有登录到机器上的用户,他还包含HKCR巢,HKCR实际上并不是一个独立的巢,而只是一个在注册表项:HKCM\SOFTWARE\Classes的快捷映射。
LocalMachine 包含 5 个项:
1). Hardware 描述计算机中的物理硬件、设备驱动程序使用该硬件的方式,以及链接核心模式驱动程序与用户模式代码的映射及相关数据。每次启动系统时都会重新创建此项中的所有数据。Description 子项
描述实际的计算机硬件。DeviceMap 子项以特定于具体驱动程序类别的格式包含杂项数据。ResourceMap 子项描述什么设备驱动程序需要什么硬件资源。Windows NT 诊断程序 () 可以以容易阅读的形式报告它的内容。
2). SAM 用户与组帐户以及 Windows 2000 Server 中的域的安全信息的目录服务数据库(SAM 即 Security Account Manager(安全帐户管理器),称为目录服务数据库)。
3). Security 包含本地安全策略,如特定的用户权利。此项仅由 Windows 2000 安全子系统使用。
4). Software 每台计算机的软件数据库。此项包含有关本地计算机上安装的软件的数据,以及各种杂项配置数据项。
5). System 控制系统启动、设备驱动程序加载、Windows 2000 服务和操作系统行为。
4.HKEY_USERS(HKUSR):包含所有用户的用户配置。
5.HKEY_CURRENT_CONFIG(HKCF):包含机器上硬件的信息。其中的两个键包含临时信息,这些信息常常会更改:
6.HKEY_DYN_DATA:是一个一般容器,包含需要存储在注册表中的违规数据。
7.HKEY_PERFORMANCE_DATA:包含与运行应用程序的性能相关的信息。
公共方法
public static void SetValue ( string keyName, string valueName, Object value ):设置指定的注册表项的指定名称/值对。如果指定的项不存在,则创建该项。参数keyName指定有效的注册表根(如“HKEY_CURRENT_USER”)开头的键的完整注册表路径,valueName指定名称/值对的名称。value指定要存储的值。表示在某个键下创建一个值。
public static void SetValue(string keyName, string valueName, Object value, RegistryValueKind valueKind):valueKind指定存储数据时使用的注册表数据类型。
RegistryValueKind是一个枚举:指定在注册表中存储值时所用的数据类型,或标识注册表中某个值的数据类型。
public enum RegistryValueKind
成员名称说明
Binary  指定任意格式的二进制数据。此值与 Win32 API 注册表数据类型 REG_BINARY 等效。
Dword    指定一个 32 位二进制数。此值与 Win32 API 注册表数据类型 REG_DWORD 等效。
ExpandString  指定一个以 NULL 结尾的字符串,该字符串中包含对环境变量(如 %PATH%,当值被检索时,就会展开)的未展开的引用。此值与 Win32 API 注册表数据类型 REG_EXPAND_SZ 等效。
MultiString  指定一个以 NULL 结尾的字符串数组,以两个空字符结束。此值与 Win32 API 注册表数据类型 REG_MULTI_SZ 等效。
Qword 指定一个 64 位二进制数。此值与 Win32 API 注册表数据类型 REG_QWORD 等效。
String    指定一个以 Null 结尾的字符串。此值与 Win32 API 注册表数据类型 REG_SZ 等效。
Unknown    指示一个不受支持的注册表数据类型。例如,不支持 Microsoft Win32 API 注册表数据类型 REG_RESOURCE_LIST。使用此值指定 SetValue 方法应在存储名称/值对时确定适当的注册表数据类型。
RegistryKey:获取RegistryKey对象的引用的过程,被视为打开一个键。
public sealed class RegistryKey : MarshalByRefObject, IDisposable:表示 Windows 注册表中的项级节点。此类是注册表封装。备注:要获取 RegistryKey 的实例,请使用 Registry类的静态成员之一。
公共属性
public string Name { get; }:检索项(键)的名称。
public int SubKeyCount { get; }:检索当前项的子项(键)数目,属性值返回当前项的子项的数目。
public int ValueCount { get; }:检索项中值的计数。
范例:
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using Microsoft.Win32;
public class Sample
{
public static void Main()
{
RegistryKey rk = Registry.CurrentUser;
Console.WriteLine("子项的个数:" + rk.SubKeyCount);
Console.WriteLine("值个个数:" + rk.ValueCount);
}
}
公共方法
public void Close ():关闭该项,如果该项的内容已修改,则将该项刷新到磁盘,备注对系统项调用此方法不会产生任何效果,原因是系统项永远都不会关闭。如果对已经关闭的 RegistryKey 的实例调用此方法,则它不执行任何操作。
public RegistryKey CreateSubKey ( string subkey ):创建一个新子项或打开一个现有子项以进行写访问。
字符串 subkey 不区分大小写,参数subkey指定要创建或打开的子项的名称或路径,返回值为RegistryKey 对象,表示新建的子项或空引用(在 Visual Basic 中为Nothing)(如果操作失败)。如果为 subkey 指定了零长度字符串,则返回当前的 RegistryKey 对象。 --注意有些表巢中不允许在表巢的根下直接创建键(eg: localmachine);
public RegistryKey CreateSubKey(string subkey, RegistryKeyPermissionCheck permissionCheck ):使用指定的权限检查选项创建一个新子项或打开一个现有子项以进行写访问。permissionCheck为RegistryKeyPermissionCheck 值之一,用于指定是否打开该项以进行读取或读/写访问。
public enum RegistryKeyPermissionCheck:
成员名称说明
Default      注册表项继承其父项的模式。除非用 ReadSubTree 或 ReadWriteSubTree 模式打开父项,否则会在尝试访问子项或值时执行安全检查。
ReadSubTree  在访问子项或值时,不执行安全检查。除非用 ReadSubTree 或 ReadWriteSubTree 打开父项,否则会在尝试打开当前项时执行安全检查。
ReadWriteSubTree  在访问子项或值时,不执行安全检查。除非用 ReadWriteSubTree 打开父项,否则
会在尝试打开当前项时执行安全检查。
范例:
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using Microsoft.Win32;
public class Sample
进入注册表{
public static void Main()
{
RegistryKey rk = Registry.CurrentUser;
RegistryKey zi = rk.CreateSubKey("first");
zi.SetValue("文化活动", "羽毛球");
RegistryKey zizi=zi.CreateSubKey("second");
zizi.SetValue("体育活动", "打乒乓球");
}
}
public void DeleteValue(string name ):从此项中删除指定值,参数name 要删除的值的名称。
public void DeleteSubKey(string subkey ):删除指定的子项。字符串 subkey 不区分大小写,参数subkey 要删除的子项的名称。
public void DeleteSubKey( string subkey, bool throwOnMissingSubKey):删除指定的子项。字符串子项不区分大小写,参数subkey指定要删除的子项的名称。 throwOnMissingSubKey指示在不到指定子项的情况下是否引发异常。如果该参数为 true,并且指定的子项不存在,则引发异常。如果该参数为 false,并且指定的子项不存在,则不执行任何操作。
public void DeleteSubKeyTree(string subkey):递归删除子项和任何子级子项。字符串 subkey 不区分大小写,参数subkey要删除的子项。
范例:
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using Microsoft.Win32;
public class Sample
{
public static void Main()
{
try
{
RegistryKey rk = Registry.CurrentUser;
RegistryKey zi = rk.OpenSubKey(@"first\second", true);
RegistryKey zizi = zi.CreateSubKey("third");
// zizi.SetValue("适当法", "信息时代");
zizi.DeleteValue("适当法", true);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}