5. 系统登录
- 虽然登录是由许多实体文件所组成,程序设计师还是可以像处理单一资料库般的对它做存取资讯的动作。
- 由于被设计成一个层次化的样式,登录允许应用程序在它的结构配置下加上它所有拥有的组织。
- 登录支援多使用者,在实质上分为二个部份:其一为本地端机器设定(HKEY_LOCAL_MACHINE),其二为使用者设定(HKEY_USERS)。
- 登录提供了许可权与稽查的安全能力,它能够被应用在特定的机码上。
- 登录允许多种资料型别,包括Binary、DWORD、String以及Multistring。
在开始了解登录的细节前,我们应该先讨论二个在Microsoft Windows 2000上可用来浏览与修改登录档的工具程序,RegEdit.exe与RegEdt32.exe。RegEdit.exe基本上与Microsoft Windows 98上的登录工具程序相同,但是它缺少了Windows 2000登录中支援的安全性特色。RegEdt32.exe较少被使用,但是它拥有所有登录机码的安全性支援,也提供更多对登录内含值的操作能力。在很多情形下您可以使用这二个工具之一来浏览与修改登录档,但是在某些情况中,您会被限制使用RegEdt32.exe或是一些其他的工具。
系统登录结构
登录是一个有限制性的、可被分享的系统资源。它产生了一些礼仪(或者协定)与规则,并由系统严格地强制执行。在继续之前,简单地说明一下登录的结构。
就像之前所提到的,系统登录被安排在一个由机码与值所组成的阶层式架构中。在机码中可以包含一个任意机码(或子机码)与值的数字。子机码等于居民,可以包含一个它们所拥有的任意子机码与值之数字。机码的名称在它们同层级间同组的资料中必须唯一,而且不能包含反斜线符号。图5-1中显示了登录的结构。
登录拥有一个逻辑的结构与一个实体的结构。程序设计师通常只关心逻辑结构的部份。在逻辑上,登录包含了一些与驱动A: 类似的一些根机码,并且把驱动C: 视为根目录。一个登录的根机码表示它为登录树上的最高节点。实际上,无论如何登录皆被保存在使用者硬盘上的多个文件中,称为hives。程序设计师只需思考登录中的一个机码路径即可。在内部地处理上,作业系统会决定哪一些hive可包含这个机码,而系统则负责存取适当的文件。
| 图5-1 使用RegEdit.exe所显示的Windows 2000登录结构 |
Windows 2000之登录提供了五个事先定义的根机码与一个事先定义的执行效能资料机码(HKEY_PERFORMANCE_DATA),显示于表格5-1中。HKEY_LOCAL_MACHINE与HKEY_USERS机码为那些已存在于登录之子机码的根机码。这个在HKEY_LOCAL_MACHINE与HKEY_USERS下之登录的逻辑分割透过提出两个截然不同的需求而提出登录的目的:特定机器之设定资讯的储存以及特定使用者设定资讯的储存。
| 表格5-1 Windows 2000事先定义的系统登录机码 |
| 事先定义的机码名称 | 说明 |
|---|---|
| HKEY_LOCAL_MACHINE | 不管哪一个使用者登录,皆应用在本地端机器上的一组登录资料。 |
| HKEY_USERS | 一组应用在特定使用者之登录资料。HKEY_USERS包含了预设使用者以及任何目前已载入之使用者设定档的 树状结构。 |
| HKEY_CURRENT_USER | 一个在HKEY_USERS下的子树之系统定义书签或别名,可以动态地指向与使用者关联之呼叫线程的登录资讯。有特别关于呼叫线程的规则,使用者可以模拟服务的使用。 |
| HKEY_CLASSES_ROOT | 一个系统为了HKEY_LOCAL_MACHINE\Software\Classes而定义的书签或别名。这个树状结构中存在着已注册的COM元件与在系统中关于Shell的相关设定 资讯。 |
| HKEY_CURRENT_CONFIG | 一个提交至HKEY_LOCAL_MACHINE\System\ |
| CurrentControlSet\Hardware Profiles\ | Current中的系统定义书签或别名。这个登录树状结构中存在着硬体设定资讯。 |
| HKEY_PERFORMANCE_ DATA | 这个事先定义的机码参考到由系统提供的即时执行效能资料以及应用程序。在登录中,它不会被回复为实际的 值。更确切地说,登录函数提供了一个一致的方法以动 态地取回系统的执行效能资料。 |
以下叁个事先定义的登录机码是在HKEY_LOCAL_MACHINE与HKEY_USERS机码下方落下之阶层区段的虚拟书签。例如,在HKEY_LOCAL_MACHINE \Software\Classes下发现的子机码也可以被系统已定义的HKEY_CLASSES_ROOT机码存取。
如同子机码名称一样,在一个单一子机码下未命名的值,除了预设值以外,所有的值必须拥有唯一的名称。所有的值,包含预设值皆为非必须的。那就是说,一个机码可以包含一个值、很多值或是根本没有值。
说明
诸如系统元件的文件名称、机码名称、子机码名称以及值的名称在Windows的国际版本中并没有特定地位。当然,任何被储存在值里面的资料通常都会使用当地的文字转换。
每一个值皆有资料与它关联。一个值的资料被格式化为一个系统已定义的资料型别,在表格5-2中说明。本章后面将描述有关这些资料型别的一些使用与分派的内容。
| 表格5-2 登录值之资料型别 |
| 登录值之资料型别 | 说明 |
|---|---|
| REG_BINARY | 一个位元组资料流。 |
| REG_DWORD | 一个32位元的数字。 |
| REG_DWORD_LITTLE_ENDIAN | 使用little-endian格式的一个32位元数字。所有的Windows系统皆使用little-endian格式来储存数字。 |
| REG_DWORD_BIG_ENDIAN | 一个使用big-endian格式之32位元数字。一些非Windows系统,例如一些执行UNIX与一个多样化的Motorola CPU的硬体皆使用big-endian格式来储存整数。 |
| REG_QWORD | 一个64位元的数字。 |
| REG_QWORD_LITTLE_ENDIAN | 一个使用little-endian格式之64位元数字。等于REG_QWORD。 |
| REG_EXPAND_SZ | 一个以零终止的字串,包含了使用「%VARIABLE_NAME%」格式的未说明环境变数之参考。此型别通常被使用来储存文件路径,因为即使使用者正在调整他的系统路径,像「%SystemRoot%」的变数允许您的路径被正确地储存(本章后面之〈在系统登录中储存资料〉一节中将讨论如何使用这个型别的值)。 |
| REG_LINK | 一个经由系统而被使用的Unicode symbolic link。您的应用程序或服务之程序代码应该不要求也不储存REG_LINK型别的值。 |
| REG_MULTI_SZ | 一个以零终止字串的序列,与二个跟随在序列之最后字串后面的零字元。 |
| REG_NONE | 没有被定义的值型别。它在功能上与REG_BINARY相同。 |
| REG_RESOURCE_LIST | 一个设备驱动的资源清单。没有被使用在使用者模式之应用程序中。 |
| REG_SZ | 一个以零终止的字串。 |
Microsoft定义了在存取登录时,程序设计师应该遵守的惯例,然而,作业系统无法执行这些惯例。例如,程序开发者常见的错误是在登录中属于特定使用者的部份放置特定机器的设定,反之亦然。
登录惯例
这一节讨论登录的用法及其惯例,特别集中在被设计用在Windows之伺服软件上。
透过系统加强的规则与规定之紧密结合,保持了登录的完整性。规定会使这个登录成为软件的一个通用资料库引擎,并帮助在此分享的系统资源避开不适当的混乱和交通。
您应该为您的软件储存架构资讯做出的第一个决定即:是哪一些资讯适用于机器(或所有使用者)或者仅适用于系统的特定使用者。以另一种方式来说,如果资讯对应到您软件中的一个特征时,不管与使用者相关的部份,您想要让将该特征设定成皆相同或者您会想让每一个使用者皆有属于自己的设定资讯呢?
在一般的情形中,当软件安装时设定为可应用于系统之所有使用者,该资讯会储存在登录中。这个处理程序很像安装硬体时在系统上的情形。相对地,在软件执行时改变使用者设定与结构通常会储存在一个特定使用者的设定中。
