**Windows Registry** (viế́t tắt là **Regedit**) là một cơ sở dữ liệu phân cấp lưu trữ các cài đặt cấp thấp cho hệ điều hành Microsoft Windows và cho các ứng dụng chọn sử dụng sổ đăng ký. Các hạt nhân, trình điều khiển thiết bị, dịch vụ, Security Accounts Manager, và giao diện người dùng đều có thể sử dụng registry. Windows registry cũng cho phép truy cập vào các bộ đếm để định hình hiệu năng hệ thống.

Nói một cách đơn giản, registry hoặc Windows Registry chứa thông tin, cài đặt, tùy chọn và các giá trị khác cho các chương trình và phần cứng được cài đặt trên tất cả các phiên bản hệ điều hành Microsoft Windows. Ví dụ: khi chương trình được cài đặt, một khóa con mới chứa các cài đặt như vị trí của chương trình, phiên bản của chương trình và cách khởi động chương trình, tất cả đều được thêm vào Windows Registry.

Khi được giới thiệu với Windows 3.1, Windows Registry chủ yếu lưu trữ thông tin cấu hình cho các thành phần dựa trên COM. Windows 95 và Windows NT đã mở rộng việc sử dụng để hợp lý hóa và tập trung hóa thông tin trong việc truyền file INI, giữ cấu hình cho các chương trình riêng lẻ và được lưu trữ tại nhiều vị trí khác nhau. Các ứng dụng Windows không yêu cầu sử dụng Windows Registry. Ví dụ,. Các ứng dụng NET Framework sử dụng các tệp XML để cấu hình, trong khi các ứng dụng di động thường giữ các tệp cấu hình của chúng với các tệp thực thi của chúng.

Cơ sở lý luận
-------------

Trước Windows Registry, các tệp `*.ini` được lưu trữ các cài đặt của mỗi chương trình dưới dạng tệp văn bản, thường nằm ở vị trí được chia sẻ không cung cấp cài đặt dành riêng cho người dùng trong kịch bản nhiều người dùng. Ngược lại, Windows Registry lưu trữ tất cả các cài đặt ứng dụng trong một kho lưu trữ logic (nhưng một số tệp riêng biệt) và ở dạng chuẩn. Theo Microsoft, điều này cung cấp một số lợi thế hơn tập tin `*.ini`. Vì phân tích tệp được thực hiện hiệu quả hơn nhiều với định dạng nhị phân, nên nó có thể được đọc từ hoặc ghi đến nhanh hơn tệp INI. Hơn nữa, dữ liệu kiểu mạnh có thể được lưu trữ trong sổ đăng ký, trái ngược với thông tin văn bản được lưu trữ trong. Tập tin INI. Đây là một lợi ích khi chỉnh sửa khóa theo cách thủ công bằng `regedit.exe`, Windows Registry Editor tích hợp. Vì cài đặt đăng ký dựa trên người dùng được tải từ đường dẫn dành riêng cho người dùng thay vì từ vị trí hệ thống chỉ đọc, nên sổ đăng ký cho phép nhiều người dùng chia sẻ cùng một máy và cũng cho phép các chương trình hoạt động cho người dùng ít đặc quyền hơn. Sao lưu và khôi phục cũng được đơn giản hóa vì có thể truy cập sổ đăng ký qua kết nối mạng để quản lý / hỗ trợ từ xa, bao gồm từ các tập lệnh, sử dụng bộ API tiêu chuẩn, miễn là dịch vụ Remote Registry đang chạy và quy tắc tường lửa cho phép điều này.

Bởi vì registry là một cơ sở dữ liệu, nó cung cấp tính toàn vẹn của hệ thống được cải thiện với các tính năng như cập nhật nguyên tử. Nếu hai quy trình cố gắng cập nhật cùng một giá trị đăng ký cùng một lúc, một thay đổi của quy trình sẽ đi trước quy trình khác và tính nhất quán chung của dữ liệu sẽ được duy trì. Trường hợp thay đổi được thực hiện tới các tệp INI, các cuộc đua cập nhật như vậy có thể dẫn đến dữ liệu không nhất quán không khớp với cập nhật của cả hai. Windows Vista và các hệ điều hành mới hơn cung cấp các bản cập nhật giao dịch cho cơ quan đăng ký bằng Trình quản lý giao dịch hạt nhân, mở rộng bảo đảm nguyên tử qua nhiều thay đổi chính và/hoặc giá trị, với ngữ nghĩa hủy bỏ cam kết truyền thống. (Tuy nhiên, lưu ý rằng NTFS cũng cung cấp hỗ trợ như vậy cho hệ thống tệp, do đó, về mặt lý thuyết, các bảo đảm tương tự có thể có được với các tệp cấu hình truyền thống.)

Cấu trúc
--------

### Khóa và giá trị

Sổ đăng ký chứa hai yếu tố cơ bản: **khóa** và **giá trị**. *Khóa registry* là các đối tượng chứa tương tự như các thư mục. *Giá trị* registry là các đối tượng không chứa tương tự như các tệp. Khóa có thể chứa giá trị và khóa con. Các khóa được tham chiếu với một cú pháp tương tự như tên đường dẫn của Windows, sử dụng dấu gạch chéo ngược để biểu thị mức phân cấp. Các khóa phải có tên không phân biệt chữ hoa chữ thường và không có dấu gạch chéo ngược.

Hệ thống phân cấp của các khóa đăng ký chỉ có thể được truy cập từ một tay cầm khóa gốc đã biết (ẩn danh nhưng có giá trị hiệu quả là một số xử lý số không đổi) được ánh xạ tới nội dung của khóa đăng ký được tải trước bởi kernel từ "hive" được lưu trữ hoặc đến nội dung của khóa con trong khóa gốc khác hoặc được ánh xạ tới dịch vụ đã đăng ký hoặc DLL cung cấp quyền truy cập vào các khóa con và giá trị được chứa.

Ví dụ HKEY\_LOCAL\_MACHINE \ Software \ Microsoft \ Windows dùng để chỉ khóa con "Windows" của khóa con "Microsoft" của khóa con "Phần mềm" của khóa gốc HKEY\_LOCAL\_MACHINE.

Có bảy khóa gốc được xác định trước, được đặt tên theo truyền thống theo các thẻ điều khiển không đổi được xác định trong API Win32 hoặc bằng các chữ viết tắt đồng nghĩa (tùy thuộc vào ứng dụng):

* HKEY\_LOCAL\_MACHINE hoặc HKLM
* HKEY\_CURRENT\_CONFIG hoặc HKCC
* HKEY\_CLASSES\_ROOT hoặc HKCR
* HKEY\_CURRENT\_USER hoặc HKCU
* HKEY\_USERS hoặc HKU
* HKEY\_PERFORMANCE\_DATA (chỉ trong Windows NT, nhưng không hiển thị trong Windows Registry Editor)
* HKEY\_DYN\_DATA (chỉ trong Windows 9x và hiển thị trong Windows Registry Editor)

Giống như các tệp và dịch vụ khác trong Windows, tất cả các khóa registry có thể bị hạn chế bởi danh sách kiểm soát truy cập (ACL), tùy thuộc vào đặc quyền người dùng hoặc mã thông báo bảo mật mà ứng dụng có được hoặc theo chính sách bảo mật hệ thống được thi hành bởi hệ thống (những hạn chế này có thể được xác định trước bởi chính hệ thống và được cấu hình bởi quản trị viên hệ thống cục bộ hoặc bởi quản trị viên tên miền). Người dùng, chương trình, dịch vụ hoặc hệ thống từ xa khác nhau chỉ có thể thấy một số phần của cấu trúc phân cấp hoặc phân cấp khác nhau từ cùng một khóa gốc.

*Giá trị* registry là các cặp tên / dữ liệu được lưu trữ trong các khóa. Giá trị registry được tham chiếu riêng từ khóa đăng ký. Mỗi giá trị registry được lưu trữ trong khóa đăng ký có một tên duy nhất có trường hợp chữ cái không đáng kể. Các hàm Windows API truy vấn và thao tác các giá trị registry lấy các tên giá trị riêng biệt với đường dẫn khóa và/hoặc xử lý xác định khóa cha. Các giá trị registry có thể chứa dấu gạch chéo ngược trong tên của chúng, nhưng làm như vậy khiến chúng khó phân biệt với các đường dẫn chính khi sử dụng một số chức năng Windows Registry API cũ (việc sử dụng bị phản đối trong Win32).

Thuật ngữ này hơi sai lệch, vì mỗi khóa registry tương tự như một mảng kết hợp, trong đó thuật ngữ tiêu chuẩn sẽ đề cập đến phần tên của mỗi giá trị đăng ký là "khóa". Các thuật ngữ này được lưu giữ từ registry 16 bit trong Windows 3, trong đó các khóa registry không thể chứa các cặp tên/dữ liệu tùy ý, mà chỉ chứa một giá trị không tên (phải là một chuỗi). Theo nghĩa này, registry Windows 3 giống như một mảng kết hợp duy nhất, trong đó các khóa (theo nghĩa của cả 'khóa đăng ký' và 'khóa mảng liên kết') đã tạo thành một hệ thống phân cấp và các giá trị đăng ký là tất cả các chuỗi. Khi registry 32 bit được tạo, khả năng bổ sung của việc tạo nhiều giá trị được đặt tên cho mỗi khóa cũng như vậy và ý nghĩa của các tên có phần bị bóp méo. Để tương thích với hành vi trước đó, mỗi khóa registry có thể có giá trị "mặc định", có tên là chuỗi trống.

Mỗi giá trị có thể lưu trữ dữ liệu tùy ý với độ dài và mã hóa thay đổi, nhưng được liên kết với một loại ký hiệu (được xác định là hằng số) xác định cách phân tích dữ liệu này. Các loại tiêu chuẩn là:

List of standard registry value types| Type ID | Symbolic type name | Meaning and encoding of the data stored in the registry value |
| --- | --- | --- |
| 0 | REG\_NONE | No type (the stored value, if any) |
| 1 | REG\_SZ | A string value, normally stored and exposed in UTF-16LE (when using the Unicode version of Win32 API functions), usually terminated by a NUL character |
| 2 | REG\_EXPAND\_SZ | An "expandable" string value that can contain environment variables, normally stored and exposed in UTF-16LE, usually terminated by a NUL character |
| 3 | REG\_BINARY | Binary data (any arbitrary data) |
| 4 | REG\_DWORD / REG\_DWORD\_LITTLE\_ENDIAN | A DWORD value, a 32-bit unsigned integer (numbers between 0 and 4,294,967,295 [232 – 1]) (little-endian) |
| 5 | REG\_DWORD\_BIG\_ENDIAN | A DWORD value, a 32-bit unsigned integer (numbers between 0 and 4,294,967,295 [232 – 1]) (big-endian) |
| 6 | REG\_LINK | A symbolic link (UNICODE) to another registry key, specifying a root key and the path to the target key |
| 7 | REG\_MULTI\_SZ | A multi-string value, which is an ordered list of non-empty strings, normally stored and exposed in UTF-16LE, each one terminated by a NUL character, the list being normally terminated by a second NUL character. |
| 8 | REG\_RESOURCE\_LIST | A resource list (used by the *Plug-n-Play* hardware enumeration and configuration) |
| 9 | REG\_FULL\_RESOURCE\_DESCRIPTOR | A resource descriptor (used by the *Plug-n-Play* hardware enumeration and configuration) |
| 10 | REG\_RESOURCE\_REQUIREMENTS\_LIST | A resource requirements list (used by the *Plug-n-Play* hardware enumeration and configuration) |
| 11 | REG\_QWORD / REG\_QWORD\_LITTLE\_ENDIAN | A QWORD value, a 64-bit integer (either big- or little-endian, or unspecified) (introduced in Windows XP) |

### Khóa gốc

Các khóa ở cấp gốc của cơ sở dữ liệu phân cấp thường được đặt tên theo định nghĩa API Windows của chúng, tất cả đều bắt đầu bằng "HKEY". Chúng thường được viết tắt thành một tên ngắn ba hoặc bốn chữ cái bắt đầu bằng "HK" (ví dụ: HKCU và HKLM). Về mặt kỹ thuật, chúng là các thẻ điều khiển được xác định trước (với các giá trị không đổi đã biết) cho các khóa cụ thể được duy trì trong bộ nhớ hoặc được lưu trữ trong các tệp trung tâm được lưu trữ trong hệ thống tệp cục bộ và được nạp bởi nhân hệ thống khi khởi động và sau đó được chia sẻ (với các quyền truy cập khác nhau) giữa tất cả các quy trình đang chạy trên hệ thống cục bộ, hoặc được tải và ánh xạ trong tất cả các quy trình bắt đầu trong phiên người dùng khi người dùng đăng nhập vào hệ thống.

Các khóa HKEY\_LOCAL\_MACHINE (dữ liệu cấu hình dành riêng cho máy cục bộ) và các khóa HKEY\_CURRENT\_USER (dữ liệu cấu hình dành riêng cho người dùng) có cấu trúc tương tự nhau; các ứng dụng người dùng thường tìm kiếm cài đặt của họ bằng cách kiểm tra đầu tiên chúng trong "HKEY\_CURRENT\_USER \ Software \ Vendor name \ Application's \ \ \ [*cần dẫn nguồn*]. Tuy nhiên, điều ngược lại có thể áp dụng cho các cài đặt chính sách do quản trị viên thực thi trong đó HKLM có thể được ưu tiên hơn HKCU. Chương trình Logo Windows có các yêu cầu cụ thể về nơi có thể lưu trữ các loại dữ liệu người dùng khác nhau và phải tuân theo khái niệm đặc quyền tối thiểu để không cần truy cập cấp quản trị viên để sử dụng ứng dụng.  

#### HKEY\_LOCAL\_MACHINE (HKLM)

HKLM, HKEY\_LOCAL\_MACHINE viết tắt các cài đặt dành riêng cho máy tính cục bộ.

Khóa được định vị bởi HKLM thực tế không được lưu trữ trên đĩa, nhưng được duy trì trong bộ nhớ bởi nhân hệ thống để ánh xạ cho tất cả các khóa con khác. Các ứng dụng không thể tạo thêm bất kỳ khóa con nào. Trên Windows NT, khóa này chứa bốn khóa con, "SAM", "SECURITY", "SYSTEM" và "SOFTWARE", được tải vào lúc khởi động trong các tệp tương ứng của chúng nằm trong thư mục%SystemRoot%\System32\config. Một khóa con thứ năm, "HARDWARE", không ổn định và được tạo ra một cách linh hoạt, và như vậy không được lưu trữ trong một tệp (nó hiển thị chế độ xem của tất cả các thiết bị Plug-and-Play hiện được phát hiện). Trên Windows Vista trở lên, một khóa con thứ sáu và thứ bảy, "COMPONENTS" và "BCD", được ánh xạ vào bộ nhớ theo kernel theo yêu cầu và được tải từ% SystemRoot%\system32\config\COMPONENTS hoặc từ dữ liệu cấu hình khởi động, \boot\BCD trên phân vùng hệ thống.

* Khóa "HKLM\SAM" thường xuất hiện dưới dạng trống đối với hầu hết người dùng (trừ khi họ được cấp quyền truy cập bởi quản trị viên của hệ thống cục bộ hoặc quản trị viên của các miền quản lý hệ thống cục bộ). Nó được sử dụng để tham chiếu tất cả các cơ sở dữ liệu "Trình quản lý tài khoản bảo mật "(SAM) cho tất cả các miền mà hệ thống cục bộ đã được ủy quyền hoặc được định cấu hình (bao gồm tên miền cục bộ của hệ thống đang chạy, cơ sở dữ liệu SAM được lưu trữ một khóa con cũng có tên "SAM ": Các khóa con khác sẽ được tạo khi cần thiết, một khóa cho mỗi miền bổ sung). Mỗi cơ sở dữ liệu SAM chứa tất cả tài khoản dựng sẵn (chủ yếu là bí danh nhóm) và tài khoản được định cấu hình (người dùng, nhóm và bí danh của họ, bao gồm tài khoản khách và tài khoản quản trị viên) được tạo và định cấu hình trên tên miền tương ứng, đối với mỗi tài khoản trong miền đó, đáng chú ý là người dùng Tên có thể được sử dụng để đăng nhập vào tên miền đó, số nhận dạng người dùng duy nhất nội bộ trong tên miền, hàm băm mật mã của mỗi mật khẩu người dùng cho mỗi giao thức xác thực được bật, vị trí lưu trữ của sổ đăng ký người dùng của họ, các cờ trạng thái khác nhau (ví dụ: tài khoản có thể được liệt kê và hiển thị trong màn hình nhắc đăng nhập) và danh sách các tên miền (bao gồm tên miền cục bộ) mà tài khoản được định cấu hình.
* Khóa "HKLM\SECURITY" thường xuất hiện trống đối với hầu hết người dùng (trừ khi họ được cấp quyền truy cập bởi người dùng có quyền quản trị) và được liên kết với cơ sở dữ liệu bảo mật của tên miền mà người dùng hiện tại đã đăng nhập (nếu người dùng đăng nhập miền hệ thống cục bộ, khóa này sẽ được liên kết với tổ hợp đăng ký được lưu trữ bởi máy cục bộ và được quản trị bởi quản trị viên hệ thống cục bộ hoặc bởi tài khoản "Hệ thống" dựng sẵn và trình cài đặt Windows). Hạt nhân sẽ truy cập nó để đọc và thực thi chính sách bảo mật áp dụng cho người dùng hiện tại và tất cả các ứng dụng hoặc hoạt động được thực hiện bởi người dùng này. Nó cũng chứa một khóa con "SAM" được liên kết động với cơ sở dữ liệu SAM của miền mà người dùng hiện tại đang đăng nhập.
* Khóa "HKLM\SYSTEM" thường chỉ có thể ghi được bởi người dùng có quyền quản trị trên hệ thống cục bộ. Nó chứa thông tin về thiết lập hệ thống Windows, dữ liệu cho trình tạo số ngẫu nhiên an toàn (RNG), danh sách các thiết bị hiện được gắn có chứa một hệ thống tệp, một số "HKLM\SYSTEM\Control Sets" có chứa cấu hình thay thế cho trình điều khiển và dịch vụ phần cứng hệ thống đang chạy trên hệ thống cục bộ (bao gồm một bản sao hiện đang được sử dụng và một bản sao lưu), một khóa con "HKLM\SYSTEM\Select" có chứa trạng thái của các Bộ điều khiển này và một "HKLM\SYSTEM\CurrentControlSet" được liên kết động khi khởi động với Control Set hiện đang được sử dụng trên hệ thống cục bộ. Mỗi Control Set được cấu hình chứa:
	+ một khóa con "Enum" liệt kê tất cả các thiết bị Plug-and-Play đã biết và liên kết chúng với các trình điều khiển hệ thống đã cài đặt (và lưu trữ các cấu hình dành riêng cho thiết bị của các trình điều khiển này),
	+ một khóa con "Services" liệt kê tất cả các trình điều khiển hệ thống đã cài đặt (với cấu hình không dành riêng cho thiết bị và liệt kê các thiết bị được khởi tạo) và tất cả các chương trình chạy dưới dạng dịch vụ (cách thức và thời điểm chúng có thể tự động khởi động),
	+ một khóa con "Control" tổ chức các trình điều khiển và chương trình phần cứng khác nhau chạy dưới dạng dịch vụ và tất cả các cấu hình khác trên toàn hệ thống,
	+ một khóa con "Hardware Profiles" liệt kê các cấu hình khác nhau đã được điều chỉnh (mỗi cấu hình có cài đặt "System" hoặc "Software" được sử dụng để sửa đổi cấu hình mặc định, trong trình điều khiển và dịch vụ hệ thống hoặc trong ứng dụng) cũng như "Hardware Profiles\Current"được liên kết động với một trong các cấu hình này.
* Khóa con "HKLM\SOFTWARE" chứa phần mềm và cài đặt Windows (trong cấu hình phần cứng mặc định). Nó chủ yếu được sửa đổi bởi các trình cài đặt ứng dụng và hệ thống. Nó được tổ chức bởi nhà cung cấp phần mềm (với một khóa con cho mỗi), nhưng cũng chứa một khóa con "Windows" cho một số cài đặt của giao diện người dùng Windows, một khóa con "Lớp" chứa tất cả các liên kết đã đăng ký từ tiện ích mở rộng tệp, loại MIME, ID lớp đối tượng và ID giao diện (cho OLE, COM/DCOM và ActiveX), cho các ứng dụng hoặc DLL được cài đặt có thể xử lý các loại này trên máy cục bộ (tuy nhiên các liên kết này có thể định cấu hình cho từng người dùng, xem bên dưới) và khóa con "Policies" (cũng được tổ chức bởi nhà cung cấp) để thực thi các chính sách sử dụng chung trên các ứng dụng và dịch vụ hệ thống (bao gồm cửa hàng chứng chỉ trung tâm được sử dụng để xác thực, ủy quyền hoặc không cho phép các hệ thống hoặc dịch vụ từ xa chạy bên ngoài miền mạng cục bộ).
* Khóa "HKLM\SOFTWARE\Wow6432Node" được sử dụng bởi các ứng dụng 32 bit trên HĐH Windows 64 bit và tương đương nhưng tách biệt với "HKLM\SOFTWARE". Đường dẫn chính được WoW64 trình bày rõ ràng cho các ứng dụng 32 bit dưới dạng HKLM\SOFTWARE  (theo cách tương tự như các ứng dụng 32 bit, coi %SystemRoot%\Syswow64 như là %SystemRoot%\System32)

Tham khảo
---------

1. ↑  Esposito, Dino (tháng 11 năm 2000). "Windows 2000 Registry: Latest Features and APIs Provide the Power to Customize and Extend Your Apps". *MSDN Magazine*. Microsoft. Bản gốc lưu trữ ngày 15 tháng 4 năm 2003. Truy cập ngày 19 tháng 7 năm 2007.
2. 1 2 3  "The System Registry".
3. ↑  "Windows 95 Architecture Components". *www.microsoft.com* (bằng tiếng Anh). Bản gốc lưu trữ ngày 7 tháng 2 năm 2008. Truy cập ngày 29 tháng 4 năm 2008. The following table shows other difficulties or limitations caused by using.INI files that are overcome by using the Registry.
4. ↑  Raymond Chen, "Why do registry keys have a default value?"
5. ↑  "Designed for Windows XP Application Specification". Microsoft. ngày 20 tháng 8 năm 2002. Truy cập ngày 8 tháng 4 năm 2009.
6. ↑  "HKEY\_LOCAL\_MACHINE". Gautam. 2009. Truy cập ngày 8 tháng 4 năm 2009.
7. ↑  "Registry Keys Affected by WOW64 (Windows)". Msdn.microsoft.com. Truy cập ngày 10 tháng 4 năm 2014.

1. ↑  When applications fail to execute because they request more privileges than they require (and are denied those privileges), this is known as a limited user application (LUA) bug.