Windows OS内部の各種設定は、「レジストリ」を使って集中管理されている。その基本的な機能や用語、主要なレジストリキーとその用途などについて解説する。
前回はWindowのメモリ管理の概要を解説した。今回はWindows OSのシステム設定などを保存する「レジストリ」について、その機能の概要やレジストリ関連用語、主要なキーとその役割などを解説する。レジストリの内部構造や64bitシステムにおけるレジストリの扱い、レジストリ関連ツールの使い方などは次回取り上げる。
「レジストリ(registry)」とは、Windowsシステム内部の各種設定値を保存しておくための中央集中型のデータベースである。ハードウェアの構成やデバイスドライバーの設定、ソフトウェアの初期値や構成内容、ユーザーごとの環境設定など、Windows OS内で動作しているさまざまなコンポーネントがこのレジストリを参照して動作している。
Windows 3.xでは、システムやアプリケーションの構成情報は「〜.ini」というテキストファイルに記述しておくのが一般的であった。例えばwin.iniやsystem.iniファイルに設定を記述しておくと、Windows OSやアプリケーションはその内容を読み込んで、システムの設定を行うようになっている。
だがテキストファイルを使ったシステムの設定管理方法は、大規模化するマルチユーザー/マルチタスクのシステムには全く対応できない。ユーザーごとに設定を分離/管理する機能もないし、設定値を安全に書き換えることすらも不可能だからだ。
そこでWindows 9x以降では、レジストリという中央集中型の設定値保存用のデータベースシステムが新たに開発され、導入された。現在のWindows OSではシステムもアプリケーションも、レジストリを参照・操作して設定を行うのが普通である。ただし、Windows以外のプラットフォームと互換性を維持するといった理由から、レジストリ以外の設定用ファイルを使うアプリケーションも少なくない。
レジストリは、機能的には単なる設定値をまとめて保存しておくファイルのように見えるかもしれない。だが実際には、レジストリは「構成マネージャー(configuration manager)」という、Windows OSの基幹となるカーネルコンポーネント(NTエグゼクティブ)と一体になって動作する、動的な構成情報の管理機能の1つである。ほとんどのレジストリエントリは静的な構造や値を持っているが、動的な値を持つエントリもあるし、ユーザーや環境ごとに自動的にレジストリのセット(ツリー)を切り替えたり、障害発生時には以前の値に戻したりする機能も持っている。またWindows OSの設計思想に従って、アクセス制御(アクセス権のないユーザーやプロセスなどからのアクセスを拒否する)や監査機能も備えているし、値変更の通知機能(特定のレジストリの内容が変更されたことをプロセスに通知する機能)なども持っている。
まずレジストリの構成要素について簡単にまとめておこう。レジストリエディターでレジストリを開くと、次のように見える。レジストリエディターは最も基本的なレジストリの操作ツールであり、「ファイル名を指定して実行」コマンドで「regedit」と入力すると起動できる(このツールの使い方は次回詳しく解説する)。
左側に表示されているのがレジストリの「キー」をツリー構造で表現したもの、右側にあるのがレジストリの「値」である。ツリーの一番上を「ルートキー」、それ以外を「サブキー」と呼ぶ。値は、ツリーの末端のキーだけでなく、中間のキーに対しても追加できる。キー名や値の名前では、大文字/小文字は区別されない。
レジストリをファイルシステムに例えると、キーはフォルダー、値の名前はファイル名、値のデータはファイルの中身、にそれぞれ相当する。だが後述するように、キーそのものが値(文字列データ)を持っていることもあるので、少し事情が異なる。
レジストリはツリー構造で定義されている。そのトップにはいくつか固定的なキーがあり、ユーザーが新しいルートを追加したり、削除したりすることはできない。これらは特別に「ルートキー」と呼ばれる。具体的には次のようなキーがあり、それぞれHKLMやHKCUのように省略した形式も利用できる(以後、本文中では全て省略形で表記する)。
値の型 | 省略形 | 意味 |
---|---|---|
HKEY_LOCAL_MACHINE | HKLM | システム固有の各種構成情報が保存されている。システム全体に関わるような設定で利用される |
HKEY_USERS | HKU | このPCにログオンしている全ユーザーのデータ。新しいユーザーがPCにログオンするたびに新しいユーザープロファイルが作成され、このキーの下にユーザーごとのサブキーが作成される |
HKEY_CURRENT_USER | HKCU | 現在ログオンしているユーザーの構成データ。例えばユーザーフォルダーのパス、画面色や設定、コントロールパネルで行ったカスタマイズ結果などが保存されている。このキーは、実際にはHKEY_USERSのサブキーのうちの1つを指すリンクになっている |
HKEY_CLASSES_ROOT | HKCR | COMオブジェクトの登録情報とファイルの関連付け情報を記録している |
HKEY_CURRENT_CONFIG | HKCC | システムの起動時に使用されるハードウェアプロファイルに関する情報が保存されている。HKLM \SYSTEM\CurrentControlSet\Hardware Profiles\Currentへのリンクになっている |
HKEY_PERFORMANCE_DATA | HKPD | システムのパフォーマンス(パフォーマンスカウンター)に関する情報を保存する。ただしこのルートキーはレジストリエディターでは表示されない |
レジストリのルートキー 主要なルートキーについては、後で詳しく説明する。 |
各キーの中には、0個以上、任意の数の「値」を置くことができる。値は、「名前」「型」「データ(内容)」から構成される。書式の自由なテキストファイル(.iniファイル)による設定と違って、目的に応じた型を使うことにより、素早く設定値を取り出して処理できるようになる。
値の型 | 意味 |
---|---|
REG_NONE | 値無し型(名前のみでデータを持たないもの) |
REG_SZ | 文字列データ |
REG_MULTI_SZ | 複数行にわたる文字列データ |
REG_EXPAND_SZ | 展開可能な文字列(環境変数参照などを含む文字列)データ |
REG_BINARY | 可変長のバイナリデータ |
REG_DWORD | 32bitの整数値データ |
REG_QWORD | 64bitの整数値データ |
レジストリの値の型 これはレジストリエディターやregコマンドで作成可能なレジストリの値の型。プログラマ的な視点から見ると、これ以外にもいくつか(他のレジストリへのリンクやバイトオーダーの異なる数値型など)ある。 |
キーの中には複数の「値」を定義できるが、キーそのものにデータを持たせることも可能である。キーが持っているデータのことをデフォルト値といい、レジストリエディターでは「(既定)」(日本語版)や「(Default)」(英語版)と表現している。キーそのものが値を持っている例を次に示す(「reg query」はレジストリの値を問い合わせるコマンド)。
C:\>reg query HKCU\AppEvents\EventLabels\.Default
HKEY_CURRENT_USER\AppEvents\EventLabels\.Default ……キー名
(既定) REG_SZ Default Beep ……デフォルト値(キーに直接割り当てられた文字列データ)
DispFileName REG_SZ @mmres.dll,-5824 ……キー内で定義されている「値」
C:\>
この例では「HKCU\AppEvents\EventLabels\.Default」キーに「Default Beep」という文字列が割り当てられている。キーがデータを持っていない場合は「(既定)」の行は表示されない。
Windows 3.xでレジストリが最初に導入されたとき、レジストリは単なるキーの集合体で、キーそのものが「文字列型」のデータを持っていた。文字列以外のデータはなかったし、キーの中に「値」はなかった。その後レジストリの機能が拡張され、キーの中に値を持たせたり、文字列型以外のデータ型も使えるようにしたため、このような仕様になっている。
以下、主なレジストリキーについて解説しておく
HKEY_LOCAL_MACHINE(HKLM)キーには、(ユーザーレベルではなく)システムレベルの全ての構成情報が保存されている。HKLMの下にあるサブキーは、実際には全て独立した「ハイブ」(後述)である。複数のサブキーがこのキーの下に集められ、1つのツリーとして見えるようになっている。それぞれのサブキーの用途は次の通りである。
キー | 用途 |
---|---|
HKEY_LOCAL_MACHINE\BCD00000000 | ブート構成情報(BCD:Boot Configuration Database)で利用される |
HKEY_LOCAL_MACHINE\HARDWARE | ハードウェア構成情報 |
HKEY_LOCAL_MACHINE\COMPONENTS | OEM構成情報。OEMカスタマイズで利用するCBS(Component Based Servicing)などで利用される |
HKEY_LOCAL_MACHINE\SYSTEM | システムをブートするために必要な、さまざまな構成情報を保存する。例えばどのデバイスドライバーをロードするか、どのサービスを起動するか、などの設定が保存されている |
HKEY_LOCAL_MACHINE\SOFTWARE | ソフトウェアの構成情報を保存する。HKLM \SYSTEMはシステムのブート時に必要となるような情報が保存されているのに対し、HKLM\SOFTWAREはそれ以外のソフトウェア(システムのブート完了後に実行されるソフトウェア)から参照される |
HKEY_LOCAL_MACHINE\SAM | SAM(Security Accounts Manager)のデータベース。SAMには、ローカルのユーザー/グループアカウントに関する情報(名前やパスワードなど)が保存されている。これは実際にはHKLM\SECURITY\SAMへのリンクになっている |
HKEY_LOCAL_MACHINE\SECURITY | セキュリティポリシーやユーザーの権利などに関する情報を保存している。セキュリティのために、一般ユーザーや管理者権限ではアクセスできないようになっている |
HKEY_LOCAL_MACHINEのサブキーとその用途 |
HKEY_USERS(HKU)キーには、システムにログオンしたことのあるユーザーの個人設定やソフトウェアの構成情報などが保存されている。
システムに一度でもログオン(サインイン)すると、「ユーザープロファイル」と呼ばれるユーザーごとの環境が用意される。そのときにHKUの下にユーザーごとのサブキーも作成され、その中に各種設定が保存される。
HKEY_CURRENT_USER(HKCU)キーは、現在ログオンしているユーザーに対応するHKUのサブキーを指すように設定される。
HKCUの主要なサブキーを次に示しておく。
サブキー | 用途 |
---|---|
AppEvents | サウンド/イベントに関する設定 |
Console | コマンドプロンプトに関する設定 |
Control Panel | コントロールパネルの各種設定 |
Environment | ユーザー環境変数 |
EUDC | ユーザー外字に関する設定 |
Network | ネットワークドライブのマッピング |
Printers | プリンター設定 |
Software | ユーザーごとのソフトウェアの構成情報 |
System | システム設定 |
Volatile Environment | 揮発性の(保存されない)ユーザー環境設定 |
HKEY_CURRENT_USERの主なサブキー |
HKEY_CLASSES_ROOT(HKCR)キーには、COMオブジェクトの登録情報とファイルの関連付け情報が記録されている。例えば、エクスプローラーでファイル名をダブルクリックした場合に起動されるプログラムの設定などが保存されている。
このキーは、実際にはHKLM\Software\Classes(システム全体のデフォルト値)とHKCU\Software\Classes(ユーザーごとの固有の設定)の2つのキーをマージしたビューになっている。そのため、例えばファイル名をダブルクリックした場合に起動されるプログラムはデフォルトでHKLM\Software\Classesの設定が使われる一方で、ユーザーが関連付けを変更するとHKCU\Software\Classes側が変更される(HKLMに書き込む権限がない場合など)。
HKEY_CURRENT_CONFIG(HKCC)キーには、システムの起動時に使用される「ハードウェアプロファイル」に関する情報が保存されている。これは実際にはHKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Currentへのリンクになっている。複数のハードウェアプロファイルが利用できる場合、HKLM\SYSTEM\CurrentControlSet\Hardware Profilesの下には複数のハードウェアプロファイルのレジストリキーが作成される。そのうちのどれを選択したかにかかわらず、HKCCを参照すれば現在使用中のプロファイルを参照できる。
ただし「ハードウェアプロファイル」の機能はWindows XPやWindows Server 2003までしか提供されておらず、現在のWindows OSでは廃止されている。
HKEY_PERFORMANCE_DATA(HKPD)キーは、レジストリ経由でパフォーマンスカウントに参照するために用意されている。ただし、HKPDの内容はレジストリエディターでは参照できず、レジストリを操作するプログラムを書く必要がある。
レジストリのツリーのうち、いくつかは特別なグループを形成しており、それらは個別の独立したファイルに保存されている。これを「ハイブ(hive)」という。
レジストリの構成マネージャーは、ハイブ(に対応するファイル)を特定のレジストリツリーの下に「ロード(配置)」することにより(ファイルシステムの「マウント」のような操作)、レジストリの内容を素早く切り替えることができる。またハイブはファイルに保存されるだけでなく、必要に応じてバックアップが作成されるので(〜.savや〜.altなど)、簡単に以前の状態にロールバックできるようになっている。
レジストリハイブのパス | ハイブのファイルパス |
---|---|
HKEY_LOCAL_MACHINE\ BCD00000000 | \Boot\BCD |
HKEY_LOCAL_MACHINE\COMPONENTS | %SystemRoot%\System32\Config\Components |
HKEY_LOCAL_MACHINE\SYSTEM | %SystemRoot%\System32\Config\System |
HKEY_LOCAL_MACHINE\SAM | %SystemRoot%\System32\Config\Sam |
HKEY_LOCAL_MACHINE\SECURITY | %SystemRoot%\System32\Config\Security |
HKEY_LOCAL_MACHINE\SOFTWARE | %SystemRoot%\System32\Config\Software |
HKEY_LOCAL_MACHINE\HARDWARE | (揮発性ハイブ。対応するファイル無し) |
HKEY_USERS\<ローカルサービスアカウントのSID(S-1-5-19)> | %SystemRoot%\ServiceProfiles\LocalService\Ntuser.dat |
HKEY_USERS\<ネットワークサービスアカウントのSID(S-1-5-20)> | %SystemRoot%\ServiceProfiles\NetworkService\NtUser.dat |
HKEY_USERS\<ユーザーアカウントのSID> | \Users\<ユーザー名>\Ntuser.dat |
HKEY_USERS\<ユーザーアカウントのSID>_Classes | \Users\<ユーザー名>\AppData\Local\Microsoft\Windows\Usrclass.dat |
HKEY_USERS\.DEFAULT | %SystemRoot%\System32\Config\Default |
レジストリハイブと対応するファイル レジストリハイブのファイルは、必要に応じてバックアップが自動的に作成される。 |
なお、全てのハイブに対して、対応するファイルがあるわけではない。上表中にあるHKLM\HARDWAREは対応するファイルを持たず、メモリの上にしか存在しない。
このレジストリキーにはハードウェアの構成情報が保存されている。そのキーの値はシステムの起動時に、システムをスキャンして自動的に作成される。そしてシステムをシャットダウンすると自動的に破棄される。
システムの構成は毎回変わる可能性があるし、起動時には必ずハードウェアのスキャンなどを行う必要があるので、ディスクには保存せず、起動ごとに作成するようになっている。
上で触れたレジストリハイブはシステムの起動時やログオン時に自動的にロードされる。その一方で、ユーザーが手動でレジストリハイブをロードしたり、アンロードしたりもできる。例えばシステムのトラブルシューティングを行う場合に、他のシステムのレジストリを一時的に(作業用のキーの下に)ロード、展開してその内容を調査したり、必要なら内容を書き換える、といったこともできる。具体的な操作については、以下のTIPS記事を参照していただきたい。
レジストリには非常に重要な情報が多く保存されているため、誰でも(Windows OS的に言うとEveryoneに対して)自由にアクセスできるようでは困る。例えばアカウント情報を保存しているHKLM\SAMキー以下は、ログオン処理をつかさどるごく一部のコンポーネントだけにアクセスを許可して、それ以外は禁止するのが望ましい。
そこでWindows OSでは、ファイルシステムなどのリソースと同様にレジストリに対しても「アクセス制御リストACL」を使った厳密なアクセス制御が行われている(ACLについては関連記事参照)。具体的には、例えばHKLM\SAMやHKLM\SECURTYに対しては、「SYSTEM」アカウントに対してのみ「フルコントロール」が付けられており、それ以外のアカウントではアクセスできないようになっている。
いくつかのレジストリキーはたとえ管理者グループでもアクセスできないようにアクセス権が設定されているが、トラブルシューティングなどのために、どうしてもその内容を確認したいことがある。こんな場合は、レジストリーエディターをSystemアカウント権限で起動するとよい。具体的にはTIPS「一時的にSystemアカウントでプログラムを実行する」のような方法を使えばよい。ここではもう少し簡単な方法として、Sysinternalsの「PsExec」ツールを使う方法を紹介する。
psexecに「-s」オプションを付けると、指定したプログラムをSYSTEMアカウント権限で起動できる。管理者権限のあるコマンドプロンプトを開いて、次のように実行する。
psexec -s -i -d c:\windows\regedit.exe
こうやって起動されたレジストリエディターなら、ほぼ制限なく全てのエントリを確認できる(ただしリモートコンピューターへの接続は不可)。
今回はWindows OSにおけるレジストリ機能の概要と主要なレジストリキーなどについて解説した。次回はより進んだ話題として、64bit(WOW64)システムにおけるレジストリの扱い(レジストリのリダイレクトやリフレクション、仮想化機能)やレジストリ関連ツールの使い方などについて取り上げる。
Copyright© Digital Advantage Corp. All Rights Reserved.