登錄檔

登錄檔是Microsoft Windows作業系統和其應用程式中的一個重要的層次型資料庫，用於儲存系統和應用程式的設定資訊。早在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 XP和Windows 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。資料結構.登錄檔由鍵組成。一個鍵可以有一個或多個值，每個值的名稱各不相同，如果一個值的名稱為空，則該值為該鍵的預設值。在登錄檔編輯器中，資料結構顯示如下，其中，command鍵是open鍵的子鍵，(預設)表示該值是預設值，值名稱為空，其資料型別為REG_SZ，資料值為%systemroot%\system32\NOTEPAD.EXE "%1以上資訊的意義是：txt型別的檔案在右鍵選單裡的“開啟”一項使用的程式是“NOTEPAD.EXE”，即用記事本開啟檔案。資料型別.登錄檔的資料型別主要有以下五種：此外，登錄檔還有其他的資料型別，但是均不常用：登錄檔的分支結構.登錄檔有五個一級分支，下面是這五個分支的名稱及作用：登錄檔的儲存方式.Windows NT系列作業系統和Windows 9x系列的儲存方式有很大區別。登錄檔被分成多個檔案儲存，稱為Registry Hives，每一個檔案被稱為一個配置單元。在早期的Windows 3.x系列中，登錄檔僅包含一個reg.dat檔案，所存放的內容後來演變為HKEY_CLASSES_ROOT分支。Windows NT家族的配置單元檔案：Windows 9x家族的配置檔案編輯登錄檔.使用登錄檔編輯器.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項下的一個子項之中。使用命令列工具.Windows自帶了一個管理登錄檔的命令列工具——reg。只需在命令提示符中執行並指定引數，即可以命令列的形式對登錄檔進行各項管理操作。支援的操作有增刪改查、匯入匯出登錄檔檔案等。使用指令碼.在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刪除一個鍵，但直到關閉相應的登錄檔控制代碼才真正完成刪除操作。RegEnumKeyEx列舉一個鍵下的所有子鍵。RegEnumValue列舉一個鍵下的所有值項。RegQueryValueEx獲取一個值項的資料。RegSaveKeyEx可以把一個鍵及所有子鍵儲存到一個檔案中。RegLoadKey把一個登錄檔檔案裝入到系統的登錄檔，RegUnLoadKey把系統登錄檔恢復到原狀態。缺點.評論家將Windows 95的登錄檔視作「單點故障」，因為不當使用「登入編輯程式」可能會造成嚴重的問題，甚至可能需要重新安裝作業系統。無法保證能夠順利解決因不當使用「登入編輯程式」所造成的問題。您必須自行承擔使用「登入編輯程式」的風險。建議您在編輯登入前，先行備份。分散與集中之爭.關於分散的文字檔案和集中的登錄檔兩種軟體配置方式的優劣，目前仍有爭論。主流作業系統中，Linux作業系統一直使用單獨的文字檔案來存放配置資訊。而Windows平臺下基於.NET框架的軟體對登錄檔的依賴性也大大減弱。事實上，.NET軟體通常使用純文字的XML，也是不爭的事實，儘管現在已經有很多軟體可以方便進行系統配置，但仍存在標準不夠統一的問題。著名開源軟體Fetchmail的作者Eric S. Raymond在《UNIX程式設計藝術》一書中有如下敘述：對比terminfo資料庫和Windows登錄檔，我們發現登錄檔出名地容易受到錯誤程式碼的破壞。這可能會使整個系統都無法使用。即使系統沒有癱瘓，但如果破壞本身干擾了專用的登錄檔編輯工具，恢復工作就會很困難。從2000年以來部分惡性病毒如熊貓燒香等的破壞情形看，的確存在“破壞本身干擾登錄檔編輯器”的問題。在某些情況下，病毒程式會監視系統程序列表，並強行關閉名為regedit的任何程式。這使得受損使用者難以直接透過編輯登錄檔進行恢復。登錄檔是Windows作業系統的核心，越來越多的駭客程式將攻擊物件轉向了登錄檔。一些程式，為了達到隨系統自動啟動的目的，會在登錄檔建立啟動項，因此監控登錄檔能夠有效地預防該類惡意程式的攻擊。