本頁使用了標題或全文手工轉換

登錄檔

維基百科,自由的百科全書
前往: 導覽搜尋
各地中文名稱
大陸 注册表
台灣 登錄檔
登錄檔
Windows Vista中的登錄檔編輯程式

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

資料結構[編輯]

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

在登錄編輯程式(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系列的儲存方式有很大區別。登錄檔被分成多個檔案儲存,稱為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

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檔案,這樣做無需在登錄檔中根據路徑一級一級地存取,而且可以直接對大量專案進行批次修改。這些檔案還可以被分發給非專業的使用者,說明他們快速地完成登錄檔的編輯,以減少出錯的可能。

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系統及應用程式的資訊被儲存在字尾名為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

參見[編輯]