登錄檔

Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息

登錄檔(英語:Registry,中國大陸譯作註冊表,港澳台譯作登錄檔)是Microsoft Windows操作系統和其應用程式中的一個重要的層次型資料庫,用於儲存系統和應用程式的設置資訊。

登錄檔
Windows Vista中的登錄檔編輯程式
Windows Vista中的登錄檔編輯程式
開發者Microsoft
目前版本
  • 5.0
編輯維基數據連結
作業系統Microsoft Windows
網站learn.microsoft.com/en-us/windows/win32/sysinfo/registry 編輯維基數據
「登錄檔」的各地常用名稱
中國大陸註冊表
臺灣登錄檔
港澳登錄檔

早在Windows 3.0推出OLE技術的時候,登錄檔就已經出現。但是,從Windows 95開始,登錄檔才真正成為Windows使用者經常接觸的內容,並在其後的作業系統中繼續沿用至今。隨後推出的Windows NT是第一個從系統級別廣泛使用登錄檔的作業系統。

歷史

前身

最初,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已經增加了權限的功能,regedit32.exe由於失去作用而被剔除。同時,這個版本的登錄檔是64位元的,這導致了一些相容性問題,少數可以執行在舊版本Windows的程式在Windows XP中無法運作。

64位元Windows的登錄檔

64位元Windows中的登錄檔結構大致與32位元版本相同,但32位元程式的資訊被放在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node而不是HKEY_LOCAL_MACHINE\SOFTWARE(64位元程式的資訊放於此處)。

數據結構

登錄檔由鍵(key,或稱「項」)、子鍵(subkey,子項)和值項(value)構成。一個鍵就是樹狀數據結構中的一個節點,而子鍵就是這個節點的子節點,子鍵也是鍵。一個值項則是一個鍵的一條內容,由名稱(name)、資料類型(datatype)以及數據(data)組成。一個鍵可以有一個或多個值,每個值的名稱各不相同,如果一個值的名稱為空,則該值為該鍵的預設值。

在登錄編輯程式(Regedit.exe)中,數據結構顯示如下,其中,command鍵是open鍵的子鍵,(預設)表示該值是預設值,值名稱為空,其資料類型為REG_SZ,數據值為%systemroot%\system32\NOTEPAD.EXE "%1

 

以上資訊的意義是:txt類型的檔案在右鍵清單里的「開啟」一項使用的程式是「NOTEPAD.EXE」,即用記事本打開檔案。

資料類型

登錄檔的資料類型主要有以下五種:

顯示類型(在編輯器中) 資料類型 說明
REG_SZ 字串 文字字串
REG_BINARY 二進制數 不定長度的二進制值,以十六進制顯示
REG_DWORD 雙字 一個 32 位的二進制值,顯示為 8 位的十六進制值
REG_MULTI_SZ 多字串 含有多個文字值的字串,此名來源於字串間用 nul 分隔、結尾兩個 nul
REG_EXPAND_SZ 可擴充字串 含有環境變數的字串

此外,登錄檔還有其他的資料類型,但是均不常用:

  • REG_DWORD_BIG_ENDIAN - DWORD 的大頭版本,下面同理
  • REG_DWORD_LITTLE_ENDIAN
  • REG_FULL_RESOURCE_DESCRIPTOR
  • REG_QWORD - DWORD 的四字(64 位)版本
  • REG_FILE_NAME

登錄檔的分支結構

登錄檔有五個一級分支,下面是這五個分支的名稱及作用:

名稱 作用
HKEY_CLASSES_ROOT 儲存Windows可辨識的檔案類型的詳細列表,以及相關聯的程式。
HKEY_CURRENT_USER 儲存當前使用者設置的資訊。
HKEY_LOCAL_MACHINE 包括安裝在電腦上的硬件和軟件的資訊。
HKEY_USERS 包含使用電腦的使用者的資訊。
HKEY_CURRENT_CONFIG 這個分支包含電腦當前的硬件組態資訊。

登錄檔的儲存方式

Windows NT系列作業系統和Windows 9x系列的儲存方式有很大區別。登錄檔被分成多個檔案儲存,稱為Registry Hives,每一個檔案被稱為一個組態單元。

在早期的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

Windows 9x家族的設定檔

名稱 登錄檔分支 作用
CLASSES HKEY_CLASSES_ROOT 儲存軟件組件媒體櫃有關資訊
USER.DAT HKEY_USERS 儲存使用者參數選擇的資訊
SYSTEM.DAT HKEY_LOCAL_MACHINE 系統資訊

編輯登錄檔

使用登錄編輯程式

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[1]

除了編輯本台電腦上登錄檔數據之外,登錄編輯程式亦可以通過檔案清單下的「載入組態單元」清單項編輯直接編輯檔案系統上的登錄檔數據檔案。該功能可以允許使用者打開檔案系統中的RegHive檔案,並將其中的數據對映到HKEY_USERS或者HKEY_LOCAL_MACHINE項下的一個子項之中。[2]

使用命令列工具(CLI

Windows內建了一個管理登錄檔的命令列工具——reg。只需在命令提示字元中執行並指定參數,即可以命令列的形式對登錄檔進行各項管理操作。支援的操作有增刪改查、匯入匯出登錄檔檔案(reg檔案)、匯入匯出或載入組態單元(RegHive)等。

使用指令碼

在Windows 98以後的作業系統中,增加了一個手稿語言直譯器,可以用來執行一些系統任務。它可以支援VBScript和JavaScript兩種手稿語言,都提供了訪問登錄檔的功能。某些病毒就利用這一點通過修改登錄檔進行傳播。

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

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

使用reg檔案

reg檔案也是一種修改登錄檔的方式。在登錄編輯程式中,使用者可以通過「檔案」清單中的「匯出」清單項來備份登錄檔中的某些專案到一個reg檔案之中;之後使用者可以再次通過「匯入」清單項將這些專案還原。reg檔案本身也在系統中被關聯到regedit.exe,因此直接雙擊打開reg檔案也會起到將其中的專案匯入到登錄檔中的效果。

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

Registry APIs

Windows SDK提供了訪問登錄檔的介面。建立或打開的鍵,必須作為當前已經打開的鍵的子鍵。HKEY_LOCAL_MACHINE, HKEY_CLASSES_ROOT, HKEY_USERS, HKEY_CURRENT_USER等預定義的鍵總是已經打開。使用RegOpenKeyEx打開鍵;使用RegCreateKeyEx建立鍵。登錄檔允許最大512層子鍵深度。通過一個登錄檔API呼叫允許一次打開或建立32層深度的登錄檔的子鍵。 RegCloseKey關閉已經打開的鍵,把數據寫回登錄檔。RegFlushKey把主記憶體中快取的登錄檔已修改數據寫回到硬碟上,因此代價高昂,要慎重呼叫。

RegSetValueEx把一個值項與其數據關聯到一個鍵上。RegDeleteVaule從鍵上刪除一個值項。RegDeleteKey刪除一個鍵,但直到關閉相應的登錄檔控制代碼(handle)才真正完成刪除操作。

RegEnumKeyEx列舉一個鍵下的所有子鍵。RegEnumValue列舉一個鍵下的所有值項。RegQueryValueEx取得一個值項的數據。

RegSaveKeyEx可以把一個鍵及所有子鍵儲存到一個檔案中。RegLoadKey把一個登錄檔檔案裝入到系統的登錄檔,RegUnLoadKey把系統登錄檔恢復到原狀態。

缺點

評論家將Windows 95的登錄檔視作「單點故障」,因為不當使用「登錄編輯程式」可能會造成嚴重的問題,甚至可能需要重新安裝作業系統。無法保證能夠順利解決因不當使用「登錄編輯程式」所造成的問題。使用者必須自行承擔使用「登錄編輯程式」的風險,因此一般建議在編輯登錄前先行備份。

分散與集中之爭

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

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

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

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

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

註釋

  1. ^ Regedit.exe 和 Regedt32.exe 的区别. Microsoft Knowledge Database. Microsoft Corporation. [2015-12-03]. (原始內容存檔於2016-12-07). 
  2. ^ 将配置单元加载到注册表. Microsoft TechNet媒體櫃. Microsoft Corporation. 2005-01 [2013-01-08]. (原始內容存檔於2014-10-03). 
  3. ^ 此段文字來自該書簡體中文版,繁體版的具體譯文可能不同於此。
  4. ^ 登錄檔監控 互聯網檔案館存檔,存檔日期2014-01-09.

參考資料

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

參見