Windows レジストリ

Windows レジストリ（）とは、Microsoft Windows オペレーティングシステムで用いられる設定情報の階層型データベースである。システムに関するデータやアプリケーションの設定、拡張子の関連付け、ユーザーパスワードなどが保存されている。Windows 95およびWindows NT以降で主流となった。

この節では、regファイルや、レジストリの実体であるハイブのバイナリファイルフォーマットregfについても解説する。

 歴史 
Windows 3.1までは、オペレーティングシステムの各種設定情報をINIファイル等の設定ファイルに保持させる方法で行われてきた。しかし、この方法では大量の設定項目を処理するには非効率的であり無駄が多いため、レジストリに置き換えられた。

現在のようにレジストリが広く用いられるようになったのはWindows 95からであるが、レジストリ自体はそれ以前、Windows 3.1のころから存在した。ただし関連付けやOLE情報など小規模な利用にとどまっていた。

 アーキテクチャ 
エディタ上ではレジストリは複数のバイナリファイルで構成され、その構造はエディタで表示されている構造とは全く異なる。、レジストリはキーと値で構成され、それぞれファイルシステム上におけるフォルダ、またはファイルに相当する。そのため、キーは複数のサブキーや値を持つことができ、キーを参照する方法として、File Explorerにおけるパスに似た参照の仕方ができる（例：HKEY_LOCAL_MACHINE\Software\Microsoft\Windows）。

 ルートキー 

+定数名前備考0x80000000HKEY_CLASSES_ROOT（HKCR）ProgIDやCLSID、IIDなどのファイル名拡張子の関連付け情報とCOMクラス登録情報などが保存されている。HKEY_LOCAL_MACHINE\Software\ClassesとHKEY_CURRENT_USER\Software\Classesのキーを結合したレジストリビュー。0x80000001HKEY_CURRENT_USER（HKCU）現在コンピューターにログオンしているユーザーのユーザープロファイル（環境変数、個人プログラムグループ、デスクトップ設定、ネットワーク接続、プリンター、およびアプリケーションの設定）が保存されている。ここに保存された情報は他のユーザーの設定情報に影響を及ぼさない。HKU\現在ログオンしているユーザーのSIDのエイリアス。0x80000002HKEY_LOCAL_MACHINE（HKLM）バスの種類、システム メモリ、インストールされているハードウェアとソフトウェアに関するデータ、PnP情報、ネットワーク ログオン設定、ネットワークセキュリティ情報、ソフトウェア関連情報、その他のシステム情報が保存されている。0x80000003HKEY_USERS（HKU）ローカル コンピューター上の新しいユーザーの既定のユーザー構成（.DEFAULT）と、全てのユーザー（ビルトインユーザーを含む）のユーザー構成を保存。0x80000004HKEY_PERFORMANCE_DATAWindows NTのみで利用可。レジストリエディタで編集不可。0x80000005HKEY_CURRENT_CONFIG（HKCC）ローカルコンピューターシステムの現在のハードウェアプロファイルに関する情報が保存されている。0x80000006HKEY_DYN_DATAWindows 9xのみで利用可。レジストリエディタで編集可。

 値 

+定数名前備考0x00000000REG_NONEデータ型なし。0x00000001REG_SZ文字列型（NULLで終端）。ANSIかUnicodeかはデータを編集するのに使用された関数に依存する。0x00000002REG_BINARY任意のデータ形式。0x00000003REG_EXPAND_SZ環境変数を表現可能な文字列型（NULLで終端）。ANSIかUnicodeかはデータを編集するのに使用された関数に依存する。0x00000004REG_DWORD / REG_DWORD_LITTLE_ENDIAN32ビット符号なし整数。0x00000005REG_DWORD_BIG_ENDIAN32ビット符号なし整数。0x00000006REG_LINKあるレジストリキーへのシンボリックリンク。0x00000007REG_MULTI_SZ1つのNULL終端文字で区切られた複数の文字列を表現可能な文字列型（２つのNULLで終端）。ANSIかUnicodeかはデータを編集するのに使用された関数に依存する。0x00000008REG_RESOURCE_LISTリソース列（PnPで使用されている）。0x00000009REG_FULL_RESOURCE_DESCRIPTOR完全リソース記述子（PnPで使用されている）。0x0000000AREG_RESOURCE_REQUIREMENTS_LISTリソース要件列（PnPで使用されている）。0x0000000BREG_QWORD / REG_QWORD_LITTLE_ENDIAN64ビット符号なし整数。

 ハイブ 

レジストリエディタでは、レジストリは統合階層型データベースとして仮想的に表示されているが、レジストリは実際にはハイブと呼ばれる多数のディスクファイルに保存される。HKLM\HARDWAREなど、ディスクに保存されるのではなく、システムの情報を収集し集約したハイブが存在する。また、HKCUなどディスク上の他のハイブからのショートカットとしてのハイブも存在する。

 ハイブの保存場所（Windows NT以降） 

+ハイブのパス対応するキーのパス%SYSTEM%\Config\SamHKEY_LOCAL_MACHINE\SAM%SYSTEM%\Config\SecurityHKEY_LOCAL_MACHINE\SECURITY%SYSTEM%\Config\SoftwareHKEY_LOCAL_MACHINE\SOFTWARE%SYSTEM%\Config\SystemHKEY_LOCAL_MACHINE\SYSTEM%SYSTEM%\Config\DefaultHKEY_USERS\.DEFAULT%SYSTEM%\Config\Userdiffなし（オペレーティングシステムのアップグレード時に使用される）。%USERPROFILE%\Ntuser.datHKEY_USERS\<ユーザーSID>%LocalAppData%\Microsoft\Windows\Usrclass.datHKEY_USERS\<ユーザーSID>_Classes（現在のユーザーであれば、HKEY_CURRENT_USER\Software\Classes）

 編集 

 レジストリエディタ（regedit.exe） 
Windows 3.1ではregedit.exe、 NT系の場合、regedit.exeとregedt32.exeの2つが存在する。Windows NT 3.xや4.xのregedit.exeには複数の制限があったが、Windows XPからは制限が撤廃され、regedt32.exeも単にregedit.exeを呼び出すだけのプログラムとなった。

レジストリは階層型データベースであるため、左側のビューにはツリー構造で表示されたキーやサブキーが表示され、右側のビューには選択されたキーの値のリストが表示される。レジストリエディタは次のことができる。

 レジストリキー、サブキー、値、値データの閲覧、作成、操作、名前変更、削除
 キーのREGファイルやレジストリハイブ形式でのインポートやエクスポート
 レジストリハイブ形式のファイルのロード、アンロード、操作（Windows NT系のみ）
 キーに対する操作の権限の閲覧、設定（Windows NT系のみ）
 選択したキーをお気に入りとしてブックマーク
 キー名、値名、値データで特定の文字列を検索
 ネットワーク上の別のコンピューターのレジストリをリモートで操作

 REGファイル 

INIファイル形式の構文を使用して、レジストリの一部をエクスポートおよびインポートするためのテキストベースの人間が読めるファイル。

Windows 9xおよびWindows NT 4.0では、REGEDIT4というヘッダが含まれ、Windows 2000以降では、Windows Registry Editor Version 5.00というヘッダが含まれる。また、REGEDIT4ヘッダを持つREGファイルはWindows 2000以降のシステムでも利用可能。; Windows 9x（Windows 4.x）
REGEDIT4
; Windows 2000以降
Windows Registry Editor Version 5.00基本的な構文は、以下の通りである。文字列型の場合、<値型>は必要ないが、値データには、C言語同様に、バックスラッシュはもう一つバックスラッシュ（\\）をつけ、引用符は先頭にバックスラッシュ（\"）をつけて、エスケープしなければならない。; 値名がある場合
[<ハイブ名>\<キー名>\<サブキー名>]
"値名"=<値型>:<値データ>
; デフォルト値の場合
[<ハイブ名>\<キー名>\<サブキー名>]
@=<値型>:<値データ>HKLM\SOFTWARE\Hogeキーにさまざまな型で値を追加する場合は、以下の通りである。[HKEY_LOCAL_MACHINE\SOFTWARE\Hoge]
"値A"="<エスケープ文字を含む文字列値データ>"
"値B"=hex:<REG_BINARY（16進数のカンマ区切り）>
"値C"=dword:<REG_DWORD/REG_DWORD_LITTLE_ENDIAN>
"値D"=hex(0):<REG_NONE（16進値のカンマ区切り）>
"値E"=hex(1):<REG_SZ（UTF-16LE値。NULLで終端する文字列を表す16新数のカンマ区切り）>
"値F"=hex(2):<REG_EXPAND_SZ（UTF-16LE値。NULLで終端する文字列を表す16進数のカンマ区切り）>
"値G"=hex(3):<REG_BINARY（16進値のカンマ区切り）>
"値H"=hex(4):<REG_DWORD/REG_DWORD_LITTLE_ENDIAN（4つの16進数のカンマ区切り）>
"値I"=hex(5):<REG_DWORD_BIG_ENDIAN（4つの16進数値のカンマ区切り）>
"値J"=hex(7):<REG_MULTI_SZ (UTF-16LE値。NULLで終わる文字列を表す16進数のカンマ区切り）>
"値K"=hex(8):<REG_RESOURCE_LIST（16進数のカンマ区切り）>
"値L"=hex(a):<REG_RESOURCE_REQUIREMENTS_LIST（16進数のカンマ区切り）>
"値M"=hex(b):<REG_QWORD/REG_QWORD_LITTLE_ENDIAN（8つの16進数のカンマ区切り）>データを削除するには、削除するデータの後にマイナス記号（-）を以下のように追加する。; キー全体を削除
[-HKEY_LOCAL_MACHINE\SOFTWARE\Hoge]

; 特定の値（かつ、そのデータ）のみを削除
[HKEY_LOCAL_MACHINE\SOFTWARE\Hoge]
"値A"=-
"値B"=-
@=- ; デフォルト値も削除する場合

 コマンドライン 
コマンドラインでは、複数のツール（reg.exe、regini.exe、regedit.exe）が利用可能である。

reg.exeのコマンドとその用途は次のとおりである。

reg add     （新しいサブキーまたはエントリを追加）
reg compare （サブキーまたはエントリを比較）
reg copy    （レジストリエントリをコピー）
reg delete  （サブキーまたはエントリを削除）
reg export  （指定の場所にサブキーおよびエントリをエクスポート）
reg import  （エクスポートしたファイルをインポート）
reg load    （レジストリハイブをロード）
reg query   （サブキーと、レジストリで指定したサブキーの下にあるエントリを列挙）
reg restore	（レジストリハイブファイルからサブキーおよびエントリを復元）
reg save    （サブキーおよびエントリをレジストリハイブファイルとして保存）
reg unload  （レジストリハイブをアンロード）

 PowerShell 
PowerShellでは、フォルダと同じようにレジストリキーや値を参照することができる。

> Get-ChildItem -Path HKCU:\ | Select-Object Name

    Hive: HKEY_CURRENT_USER

Name
----
HKEY_CURRENT_USER\AppEvents
HKEY_CURRENT_USER\Console
HKEY_CURRENT_USER\Control Panel
HKEY_CURRENT_USER\DirectShow
HKEY_CURRENT_USER\dummy
HKEY_CURRENT_USER\Environment
HKEY_CURRENT_USER\EUDC
...

 プログラム 
プログラムが直接レジストリを編集するための高レベルAPIがadvapi32.dllを通して公開されている。プラットフォームAPIに直接アクセスする方法があるにもかかわらず、ラッパーを公開している言語も存在する（C#やVB：Microsoft.Win32.Registry、Delphi：TRegistry）。特に有名な関数を以下に挙げる（ANSIやUnicodeの区別はしない）。
























 セキュリティ 
Windows NT以降のレジストリの各キーは、NTFS上のファイル等と同様、細かくアクセス制御するためのセキュリティ記述子が存在する。ここでは、レジストリキー特有のアクセス制御の種類のみについて説明する。

 アクセス制御の種類 
+値名前記述子トークン備考0x00000001KEY_QUERY_VALUECCレジストリキー値を読み取る権利。0x00000002KEY_SET_VALUEDC新しい値を作成、変更、削除する権利。0x00000004KEY_CREATE_SUB_KEYLCサブキーを作成する権利。0x00000008KEY_ENUMERATE_SUB_KEYSSWサブキーを列挙する権利。0x00000010KEY_NOTIFYRPキーまたはサブキーの変更を通知される権利。0x00000020KEY_CREATE_LINKWPリンクを作成する権利（システムによって予約済み）。

 REGFフォーマット 

レジストリハイブのバイナリファイルフォーマット（REGF）は公式にはこれまで公開されたことはない。しかし、Microsoft Symbol Serverからは未公開の関数や構造体のシンボル情報が事実上公開されており、Windows Internalsブックには、レジストリとそのバイナリファイル形式の詳細が書かれているセクションが存在する。

REGFファイルには、ベースブロック（ヘッダー）と、ビンのシーケンスで構成され、1つのビンの中にはそのヘッダと断続的に割り当てられたセルが存在する。

 ベースブロック（Base block） 
フォーマットのバージョン、一番最初のビンのオフセット、全てのビンのサイズなどの情報が含まれた、4096バイト長（HBASE_BLOCK）のデータ。

 ビン（Bin） 
自身のオフセット、自身のサイズなどの情報が含まれた、32バイト長（HBIN）のデータ。このデータのすぐ後にこのビンの一番最初のセルのデータが続く。

 セル（Cell） 
キー、サブキー、値、値データ、ACLなどレジストリエディタで表示される全てのエンティティを表し、自身のサイズと実際のバイナリデータが含まれた可変長（HCELL）のデータ（ビン内部の割り当てられていないスペースもこのデータで表される）。

+種類シグネチャ備考キーノードnk単一のレジストリキーとそれに関連するデータ（CM_KEY_NODE）を表す。サブキーのインデックスli、lf、lh、ri特定のキーのサブキーを表すキーノードセルのインデックスの可変長リストのデータ（CM_KEY_INDEX）。パフォーマンス上の理由から、サブキーインデックスには、インデックスリーフ(li)、ファストリーフ(lf)、ハッシュリーフ(lh)、ルートインデックス(ri)の4つの種類が存在する。キーの値vkキーの名前、タイプ、データの長さ、実際のデータを含むセルへの参照などのデータ（CM_KEY_VALUE）を表す。セキュリティ記述子sk1つ以上のキーのアクセス制御情報のデータ（CM_KEY_SECURITY）表す。ビッグデータbdハイブバージョン1.4以降で16 KiBを超える値データ（CM_BIG_DATA）を表す。最大16 KiBのチャンクデータに分割される。未割り当てデータなし。なし。

 バックアップ・復旧 
何らかの原因によりレジストリに不正な設定が書き込まれたり、レジストリデータベースが破壊された際、システムが自動的にバックアップしたデータベースから復旧できる場合がある。Windows XPの場合、レジストリデータベースの本体は、%System%\Config\ の配下にある。システムは、%SystemRoot%\Repair\配下にWindowsのインストール完了時点の設定データベースをバックアップしているため、回復コンソールなどを使用して、ファイルをコピーすることでレジストリの設定値を戻すことができる。

 脚注 

 注釈 

 出典　

外部リンク
 Microsoft Windows レジストリの説明

Category:Windowsのコンポーネント
Category:システムソフトウェア