登錄檔

維基百科,自由的百科全書
前往: 導覽搜尋
Windows Vista中的登錄檔編輯程式

註冊表(Registry,台灣、港澳譯作登錄檔,中國譯作注册表)是Microsoft Windows中的一個重要的數據庫,用於存儲系統和應用程序的設置信息。早在Windows 3.0推出OLE技術的時候,註冊表就已經出現。隨後推出的Windows NT是第一個從系統級別廣泛使用註冊表的操作系統。但是,從Windows 95開始,註冊表才真正成為Windows用戶經常接觸的內容,並在其後的操作系統中繼續沿用至今。

數據結構[編輯]

註冊表由鍵(或稱「項」)、子鍵(子項)和值項構成。一個鍵就是分支中的一個文件夾,而子鍵就是這個文件夾中的子文件夾,子鍵同樣是一個鍵。一個值項則是一個鍵的當前定義,由名稱、數據類型以及分配的值組成。一個鍵可以有一個或多個值,每個值的名稱各不相同,如果一個值的名稱為空,則該值為該鍵的默認值。

在註冊表編輯器(Regedit.exe)中,數據結構顯示如下,其中,command鍵是open鍵的子鍵,(默認)表示該值是默認值,值名稱為空,其數據類型為REG_SZ,數據值為%systemroot%\system32\NOTEPAD.EXE "%1

Regedit-txtfile.png

以上信息的意義是:txt類型的文件在右鍵菜單里的「開啟」一項使用的程序是「NOTEPAD.EXE」,即用記事本打開文件。

數據類型[編輯]

註冊表的數據類型主要有以下五種:

顯示類型(在編輯器中) 數據類型 說明
REG_SZ 字符串 文本字串
REG_BINARY 二進制數 二進制值,以十六進制顯示。
REG_DWORD 雙字 一個32位的二進制值,顯示為8位的十六進制值。
REG_MULTI_SZ 多字符串 含有多個文本值的字符串
REG_EXPAND_SZ 可擴充字符串

此外,註冊表還有其他的數據類型,但是均不常用:

  • REG_DWORD_BIG_ENDIAN
  • REG_DWORD_LITTLE_ENDIAN
  • REG_FULL_RESOURCE_DESCRIPTOR
  • REG_QWORD
  • REG_FILE_NAME

註冊表的分支[編輯]

註冊表有五個分支,下面是這五個分支的名稱及作用:

名稱 作用
HKEY_CLASSES_ROOT 存儲Windows可識別的文件類型的詳細列表,以及相關聯的程序。
HKEY_CURRENT_USER 存儲當前用戶設置的信息。
HKEY_LOCAL_MACHINE 包括安裝在計算機上的硬件和軟件的信息。
HKEY_USERS 包含使用計算機的用戶的信息。
HKEY_CURRENT_CONFIG 這個分支包含計算機當前的硬件配置信息。

註冊表的存儲方式[編輯]

註冊表的存儲位置隨着Windows的版本變化而不同。尤其是Windows NT家族操作系統和Windows 95家族的存儲方式有很大區別。註冊表被分成多個文件存儲,每一個文件被稱為一個配置單元。

在早期的Windows 3.x系列中,註冊表僅包含一個reg.dat文件,所存放的內容後來演變為HKEY_CLASSES_ROOT分支。

Windows NT家族的配置單元文件:

名稱 註冊表分支 作用
SYSTEM HKEY_LOCAL_MACHINE\SYSTEM 存儲計算機硬件和系統的信息
NTUSER.DAT HKEY_CURRENT_USER 存儲用戶參數選擇的信息(此文件放置於用戶個人目錄,和其他註冊表文件是分開的)
SAM HKEY_LOCAL_MACHINE\SAM 用戶及密碼的數據庫
SECURITY HKEY_LOCAL_MACHINE\SECURITY 安全性設置信息
SOFTWARE HKEY_LOCAL_MACHINE\SOFTWARE 安裝的軟件信息
DEFAULT HKEY_USERS\DEFAULT 缺省啟動用戶的信息
USERDIFF HKEY_USERS 管理員對用戶強行進行的設置
  • 假設Windows安裝於C盤,則在Windows XP以前,文件存放於C:\WINNT\SYSTEM32\CONFIG,而XP及以後則存放於C:\WINDOWS\SYSTEM32\CONFIG

Windos95家族的配置文件

名稱 註冊表分支 作用
CLASSES HKEY_CLASSES_ROOT 存儲軟件組件庫有關信息
USER.DAT HKEY_USERS 存儲用戶參數選擇的信息
SYSTEM.DAT HKEY_LOCAL_MACHINE 系統信息

編輯註冊表[編輯]

使用註冊表編輯器[編輯]

在Windows 2000下的註冊表編輯器截圖

Microsoft公司不建議用戶自行更改註冊表,因為如果對註冊表進行了不當修改,就有可能造成Windows系統的某些功能失效,甚至導致系統崩潰。但是,Microsoft公司仍然在Windows中提供了註冊表編輯器,它位於%systemroot%\regedit.exe。在Windows NT中使用的則是界面有所不同的REGEDT32.exe。而在Windows 2000中,兩個程序同時存在於系統中。部分的原因是Windows 2000版本的regedit.exe尚不支持對註冊表數據設置安全性。但在Windows XP及以後的操作系統中,regedit.exe已經能夠支持註冊表安全設置了,因此REGEDT32.exe失去了存在的必要。不過它仍被保留,只是該程序執行時僅僅會自動調用regedit.exe。

除了編輯本台計算機上註冊表數據之外,註冊表編輯器亦可以通過文件菜單下的「加載配置單元」菜單項編輯直接編輯文件系統上的註冊表數據文件。該功能可以允許用戶打開文件系統中的RegHive文件,並將其中的數據映射到HKEY_USERS或者HKEY_LOCAL_MACHINE項下的一個子項之中。[1]

使用腳本[編輯]

在Windows 98以後的操作系統中,增加了一個腳本語言解釋器,可以用來執行一些系統任務。它可以支持VBScript和JavaScript兩種腳本語言,都提供了訪問註冊表的功能。某些病毒就利用這一點通過修改註冊表進行傳播。

使用第三方或自行編寫的軟件[編輯]

訪問註冊表的系統功能對編程人員是開放的,因此有許多軟件都有讀寫註冊表的功能。事實上,Windows平台下開發的軟件幾乎都在不同程度上修改註冊表,以便保存一些在程序多次運行之間需要保留的信息,以及讓軟件可以通過某種特定方式(例如,右鍵菜單)啟動。也有一些軟件是專門開發出來對註冊表進行優化和設置的。

使用reg文件[編輯]

reg文件也是一種修改註冊表的方式。在註冊表編輯器中,用戶可以通過「文件」菜單中的「導出」菜單項來備份註冊表中的某些項目到一個reg文件之中;之後用戶可以再次通過「導入」菜單項將這些項目還原。reg文件本身也在系統中被關聯到regedit.exe,因此直接雙擊打開reg文件也會起到將其中的項目導入到註冊表中的效果。

而事實上,reg文件是根據一定格式編寫的純文本文件。因此,熟練的用戶可以直接使用文本編輯器(比如記事本)來創建自己的reg文件,這樣做無需在註冊表中根據路徑一級一級地訪問,而且可以直接對大量項目進行批量修改。這些文件還可以被分發給非專業的用戶,幫助他們快速地完成註冊表的編輯,以減少出錯的可能。

歷史[編輯]

前身[編輯]

最初,Windows系統及應用程序的信息被存儲在後綴名為ini的文本文件中,這就是註冊表的前身。但是這麼做有着致命弱點:因為每一個程序都會新安裝一個或多個ini文件,來存儲程序信息,導致信息的分布極為零亂;而且在16位系統下,ini文件的大小必須在64KB之內。所以ini文件被認為不便於使用和管理。

發布與發展[編輯]

在最早出現於Windows 3.0的OLE技術出現後,微軟為了存放系統中大量的軟件組件信息,組織了一個reg.dat的數據庫來存放這些信息。當時的註冊表編輯器為16位版本的regedit.exe,功能較弱。

後來開發的Windows NT則更進一步使用相同的文件格式來存放系統的配置信息,以取代原有的ini文件。該系統為每一個用戶在用戶目錄下創建了一個自身的註冊表空間,而系統的設置被存放在系統文件夾中。由於Windows NT是一個32位操作系統,regedit.exe被升級為regedt32.exe,並增加了對權限的設置功能。

Windows 95中,註冊表首次得到廣泛應用,逐漸淘汰了原有的ini文件。程序在安裝時,不再將數據寫入ini文件,而直接寫入註冊表。為了最大限度兼容舊程序,部分原來用於讀寫ini文件的專門API函數仍然可用,但現在是訪問註冊表(寫入或讀取)。Windows 95為了保持和Windows 3.x系列的兼容性,註冊表的架構與Windows NT不同,為此專門開發了另一個32位版本的regedit.exe,它沒有設置權限的功能。

Windows 2000中,由於Windows 95家族已經深入人心,regedit.exe也得到廣泛應用,相反regedt32.exe的界面相對比較醜陋,因此微軟將windows 95系列的regedit.exe拿過來用。但由於移植過來的regedit.exe仍沒有權限設置的功能,regedt32.exe仍然保留在系統中用作權限設置。

Windows XPWindows Server 2003中,regedit.exe已經增加了權限的功能,regedt32.exe由於失去作用而被剔除。同時,這個版本的註冊表是64位的,這導致了一些兼容性問題,少數可以運行在舊版本Windows的程序在Windows XP中無法運作。

64位Windows的註冊表[編輯]

64位Windows中的註冊表結構大致與32位版本相同,但32位程序的信息被放在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node而不是HKEY_LOCAL_MACHINE\SOFTWARE(64位程序的信息放於此處)。

分散與集中之爭[編輯]

關於分散的文本文件和集中的註冊表兩種軟件配置方式的優劣,目前仍有爭論。主流操作系統中,Linux操作系統一直使用單獨的文本文件來存放配置信息。而Windows平台下基於.NET框架的軟件對註冊表的依賴性也大大減弱。事實上,.NET軟件通常使用純文本的XML(稱為app.config)文件而不是註冊表進行配置,這在某種意義上是向當初的ini文本配置方式的一種回歸。部分綠色軟件支持者認為,集中式的註冊表要求軟件需要進行專門的安裝步驟才可以正常運行,而單獨的文本配置文件則可以不需要安裝,只要將軟件的文件目錄拷貝過來就可以使用;當不再需要軟件的時候,除刪除相關文件外對於註冊表也需要進行卸載步驟,才有可能不在系統中留下痕迹(很多軟件即使提供了卸載步驟,仍然會留下痕迹),如果使用文本配置文件,則能做得更乾淨。但是,文本配置方式導致某些系統軟件的配置較為困難且缺乏統一的界面(如Linux中的情況),也是不爭的事實,儘管現在已經有很多軟件可以方便進行系統配置,但仍存在標準不夠統一的問題。

著名開源軟件Fetchmail的作者Eric S. Raymond在《UNIX編程藝術》一書中有如下敘述[2]

對比terminfo數據庫和Windows註冊表,我們發現註冊表出名地容易受到錯誤代碼的破壞。這可能會使整個系統都無法使用。即使系統沒有癱瘓,但如果破壞本身干擾了專用的註冊表編輯工具,恢復工作就會很困難。

從2000年以來部分惡性病毒熊貓燒香等的破壞情形看,的確存在「破壞本身干擾註冊表編輯器」的問題。在某些情況下,病毒程序會監視系統進程列表,並強行關閉名為regedit的任何程序。這使得受損用戶難以直接通過編輯註冊表進行恢復。

註冊表是Windows操作系統的核心,越來越多的黑客程序將攻擊對象轉向了註冊表。一些程序(尤其是惡意程序),為了達到隨系統自動啟動的目的,會在註冊表創建啟動項,因此監控註冊表能夠有效地預防該類惡意程序的攻擊。[3]

注釋[編輯]

  1. ^ 將配置單元加載到註冊表. Microsoft TechNet庫. Microsoft Corporation. 2005-01 [2013-01-08]. 
  2. ^ 此段文字來自該書簡體中文版,繁體版的具體譯文可能不同於此。
  3. ^ 註冊表監控

參考資料[編輯]

  • Windows XP專業版從入門到精通(中文版),Mark Minasi著,王珺、屈馬瓏等譯,ISBN 7-5053-7569-5
  • Unix編程藝術(簡體中文版),Eric S. Raymond著,姜宏 何源 蔡曉俊 譯,電子工業出版社 ISBN 7-121-02116-1

參見[編輯]