第5回 システム設定を集中管理するレジストリWindows OS入門

Windows OS内部の各種設定は、「レジストリ」を使って集中管理されている。その基本的な機能や用語、主要なレジストリキーとその用途などについて解説する。

» 2015年01月22日 17時44分 公開
[打越浩幸デジタルアドバンテージ]
Windows OS入門
Windows Server Insider


「Windows OS入門」のインデックス

連載目次

 前回はWindowのメモリ管理の概要を解説した。今回はWindows OSのシステム設定などを保存する「レジストリ」について、その機能の概要やレジストリ関連用語、主要なキーとその役割などを解説する。レジストリの内部構造や64bitシステムにおけるレジストリの扱い、レジストリ関連ツールの使い方などは次回取り上げる。

システムの各種設定を保存する「レジストリ」

 「レジストリ(registry)」とは、Windowsシステム内部の各種設定値を保存しておくための中央集中型のデータベースである。ハードウェアの構成やデバイスドライバーの設定、ソフトウェアの初期値や構成内容、ユーザーごとの環境設定など、Windows OS内で動作しているさまざまなコンポーネントがこのレジストリを参照して動作している。

 Windows 3.xでは、システムやアプリケーションの構成情報は「〜.ini」というテキストファイルに記述しておくのが一般的であった。例えばwin.iniやsystem.iniファイルに設定を記述しておくと、Windows OSやアプリケーションはその内容を読み込んで、システムの設定を行うようになっている。

.iniファイルによるシステムの設定 .iniファイルによるシステムの設定
Windows 3.xのころは、system.iniやwin.iniなどの.iniファイルに設定を記述していた。Windows OSやアプリケーションはこれらのファイルやアプリケーション独自の.iniファイルを読み込んで自身の設定を行っていた。互換性のため(これらのファイルを直接読み込もうとする古いプログラムのために)、実は現在のWindows OSでもこれらのファイルが用意されている。これはWindows 7の\Windowsフォルダーにあるwin.iniファイルの例。

 だがテキストファイルを使ったシステムの設定管理方法は、大規模化するマルチユーザー/マルチタスクのシステムには全く対応できない。ユーザーごとに設定を分離/管理する機能もないし、設定値を安全に書き換えることすらも不可能だからだ。

 そこでWindows 9x以降では、レジストリという中央集中型の設定値保存用のデータベースシステムが新たに開発され、導入された。現在のWindows OSではシステムもアプリケーションも、レジストリを参照・操作して設定を行うのが普通である。ただし、Windows以外のプラットフォームと互換性を維持するといった理由から、レジストリ以外の設定用ファイルを使うアプリケーションも少なくない。

 レジストリは、機能的には単なる設定値をまとめて保存しておくファイルのように見えるかもしれない。だが実際には、レジストリは「構成マネージャー(configuration manager)」という、Windows OSの基幹となるカーネルコンポーネント(NTエグゼクティブ)と一体になって動作する、動的な構成情報の管理機能の1つである。ほとんどのレジストリエントリは静的な構造や値を持っているが、動的な値を持つエントリもあるし、ユーザーや環境ごとに自動的にレジストリのセット(ツリー)を切り替えたり、障害発生時には以前の値に戻したりする機能も持っている。またWindows OSの設計思想に従って、アクセス制御(アクセス権のないユーザーやプロセスなどからのアクセスを拒否する)や監査機能も備えているし、値変更の通知機能(特定のレジストリの内容が変更されたことをプロセスに通知する機能)なども持っている。

レジストリの構成要素

 まずレジストリの構成要素について簡単にまとめておこう。レジストリエディターでレジストリを開くと、次のように見える。レジストリエディターは最も基本的なレジストリの操作ツールであり、「ファイル名を指定して実行」コマンドで「regedit」と入力すると起動できる(このツールの使い方は次回詳しく解説する)。

レジストリエディターでレジストリの内容を見る レジストリエディターでレジストリの内容を見る
レジストリの値をチェックしたり、変更したりするにはいくつか方法がある。一般的には「レジストリエディター」を使う。これはWindows 7におけるレジストリエディターの実行例。
  (1)レジストリのルートキー。
  (2)レジストリハイブの例。レジストリは単一のツリー構造の集合体に見える。しかし実際には、いくつかのレジストリエントリは物理的には別の場所にあるファイルなどに保存されている。レジストリ(の構成マネージャー)はそれらのキーや値を1つのツリービューに見えるように管理している。
  (3)レジストリの「キー」。キーはツリー状に構築できる。あるキーの下にあるキーをサブキーと呼ぶ。
  (4)レジストリの「値」。
  (5)レジストリエディターの表示では、一番上には常に「(既定)」「REG_SZ」「(値の設定なし)」というエントリが表示される。これはキーのデフォルト値(既定値)が何も定義されていないことを表しているが、キーによっては、ここに直接データ(文字列)が設定されていることもある(キーそのものがデータを持っていることもある、ということ)。
  (6)レジストリの「値」の名前。
  (7)レジストリの「値」のデータ型。
  (8)レジストリの「値」のデータ(内容)。

 左側に表示されているのがレジストリの「キー」をツリー構造で表現したもの、右側にあるのがレジストリの「」である。ツリーの一番上を「ルートキー」、それ以外を「サブキー」と呼ぶ。値は、ツリーの末端のキーだけでなく、中間のキーに対しても追加できる。キー名や値の名前では、大文字/小文字は区別されない。

 レジストリをファイルシステムに例えると、キーはフォルダー、値の名前はファイル名、値のデータはファイルの中身、にそれぞれ相当する。だが後述するように、キーそのものが値(文字列データ)を持っていることもあるので、少し事情が異なる。

●レジストリのルートキー

 レジストリはツリー構造で定義されている。そのトップにはいくつか固定的なキーがあり、ユーザーが新しいルートを追加したり、削除したりすることはできない。これらは特別に「ルートキー」と呼ばれる。具体的には次のようなキーがあり、それぞれ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キー

 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/HKEY_CURRENT_USERキー

 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キー

 HKEY_CLASSES_ROOT(HKCR)キーには、COMオブジェクトの登録情報とファイルの関連付け情報が記録されている。例えば、エクスプローラーでファイル名をダブルクリックした場合に起動されるプログラムの設定などが保存されている。

 このキーは、実際にはHKLM\Software\Classes(システム全体のデフォルト値)とHKCU\Software\Classes(ユーザーごとの固有の設定)の2つのキーをマージしたビューになっている。そのため、例えばファイル名をダブルクリックした場合に起動されるプログラムはデフォルトでHKLM\Software\Classesの設定が使われる一方で、ユーザーが関連付けを変更するとHKCU\Software\Classes側が変更される(HKLMに書き込む権限がない場合など)。

●HKEY_CURRENT_CONFIGキー

 HKEY_CURRENT_CONFIG(HKCC)キーには、システムの起動時に使用される「ハードウェアプロファイル」に関する情報が保存されている。これは実際にはHKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Currentへのリンクになっている。複数のハードウェアプロファイルが利用できる場合、HKLM\SYSTEM\CurrentControlSet\Hardware Profilesの下には複数のハードウェアプロファイルのレジストリキーが作成される。そのうちのどれを選択したかにかかわらず、HKCCを参照すれば現在使用中のプロファイルを参照できる。

 ただし「ハードウェアプロファイル」の機能はWindows XPやWindows Server 2003までしか提供されておらず、現在のWindows OSでは廃止されている。

ハードウェアプロファイルの例 ハードウェアプロファイルの例
これはWindows Server 2003のハードウェアプロファイルの選択画面。「システムのプロパティ」画面で「ハードウェア」タブを選択し、「ハードウェア プロファイル」ボタンをクリックすると表示される。ノートPCなので、ドッキングステーションに接続しているときと、そうでないときに設定を切り替える、といった用途を想定していた(プロファイルに応じて、デバイスドライバーの有効/無効を切り替えることができる)。現在ではOSのプラグ&プレイ機能が向上し、常に最適な状態で起動できるので必要なくなった。
  (1)プロファイルの例。複数のハードウェアプロファイルがあると、起動時に選択できるようになる。

●HKEY_PERFORMANCE_DATAキー

 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は対応するファイルを持たず、メモリの上にしか存在しない。

 このレジストリキーにはハードウェアの構成情報が保存されている。そのキーの値はシステムの起動時に、システムをスキャンして自動的に作成される。そしてシステムをシャットダウンすると自動的に破棄される。

 システムの構成は毎回変わる可能性があるし、起動時には必ずハードウェアのスキャンなどを行う必要があるので、ディスクには保存せず、起動ごとに作成するようになっている。

自動ロードされるハイブのリスト 自動ロードされるハイブのリスト
レジストリの構成マネージャーは、起動時にこのハイブのリストに基づいて、ハイブ(のファイル)を指定されたレジストリキーの下にロードする。
  (1)ハイブリストのエントリ(HKLM\System\CurrentControlSet\Control\hivelist)。
  (2)ハイブがロードされるレジストリの場所。
  (3)ロードされるハイブのファイル名。

Column「レジストリハイブのロードとアンロード」

 上で触れたレジストリハイブはシステムの起動時やログオン時に自動的にロードされる。その一方で、ユーザーが手動でレジストリハイブをロードしたり、アンロードしたりもできる。例えばシステムのトラブルシューティングを行う場合に、他のシステムのレジストリを一時的に(作業用のキーの下に)ロード、展開してその内容を調査したり、必要なら内容を書き換える、といったこともできる。具体的な操作については、以下のTIPS記事を参照していただきたい。


レジストリのアクセス権

 レジストリには非常に重要な情報が多く保存されているため、誰でも(Windows OS的に言うとEveryoneに対して)自由にアクセスできるようでは困る。例えばアカウント情報を保存しているHKLM\SAMキー以下は、ログオン処理をつかさどるごく一部のコンポーネントだけにアクセスを許可して、それ以外は禁止するのが望ましい。

Windows Server Insiderの関連記事 Windows OS入門「アクセス制御リストACL

 そこでWindows OSでは、ファイルシステムなどのリソースと同様にレジストリに対しても「アクセス制御リストACL」を使った厳密なアクセス制御が行われている(ACLについては関連記事参照)。具体的には、例えばHKLM\SAMやHKLM\SECURTYに対しては、「SYSTEM」アカウントに対してのみ「フルコントロール」が付けられており、それ以外のアカウントではアクセスできないようになっている。

アクセスが制限されているエントリの例 アクセスが制限されているエントリの例
アカウント情報が保存されているHKLM\SAMレジストリキーの例。
  (1)HKLM\SAM\SAMを選択してみる。だがこのSAMキーを開くことはできず、その中を見ることはできない。そこでこのキーを右クリックして、ポップアップメニューから[アクセス許可]を選択してみる。
  (2)SYSTEMに対してはフルコントロールが付いている。
  (3)だがAdministratorsに対してはアクセス許可権限が何もないので、これ以上アクセスできない。

Column「制限されたレジストリの内容を表示させる」

 いくつかのレジストリキーはたとえ管理者グループでもアクセスできないようにアクセス権が設定されているが、トラブルシューティングなどのために、どうしてもその内容を確認したいことがある。こんな場合は、レジストリーエディターをSystemアカウント権限で起動するとよい。具体的にはTIPS「一時的にSystemアカウントでプログラムを実行する」のような方法を使えばよい。ここではもう少し簡単な方法として、Sysinternalsの「PsExec」ツールを使う方法を紹介する。

 psexecに「-s」オプションを付けると、指定したプログラムをSYSTEMアカウント権限で起動できる。管理者権限のあるコマンドプロンプトを開いて、次のように実行する。

psexec -s -i -d c:\windows\regedit.exe



 こうやって起動されたレジストリエディターなら、ほぼ制限なく全てのエントリを確認できる(ただしリモートコンピューターへの接続は不可)。

SAMの内容を確認してみる SAMの内容を確認してみる
Systemアカウントで起動したレジストリエディターなら制限なく操作・閲覧できる。
  (1)今度はHKLM\SAM\SAM以下が展開・表示されている。



 今回はWindows OSにおけるレジストリ機能の概要と主要なレジストリキーなどについて解説した。次回はより進んだ話題として、64bit(WOW64)システムにおけるレジストリの扱い(レジストリのリダイレクトやリフレクション、仮想化機能)やレジストリ関連ツールの使い方などについて取り上げる。


「Windows OS入門」のインデックス

Windows OS入門

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

AI for エンジニアリング
「サプライチェーン攻撃」対策
1P情シスのための脆弱性管理/対策の現実解
OSSのサプライチェーン管理、取るべきアクションとは
Microsoft & Windows最前線2024
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。