Windowsの設定データをAPIからアクセスできるよう
情報がまとめて保存された「レジストリ」
レジストリ(Registry)とは、Windowsがシステムやアプリケーションの設定データなどを管理する仕組みだ。ファイルに直接保存する設定情報と違い、構造化されたデータをAPI経由でアクセスするため、データの読み書きや解釈に対する処理が不要で、高速なアクセスが可能というメリットがある。
初期のWindowsでは、ファイルに設定データなどを保存していたが、システムが複雑化/高性能化するとファイルによる管理が困難になる。そこで導入されたのがWindowsのAPIを介してアクセスする構造化されたデータ構造であるレジストリだ。
レジストリに含まれている情報の一部は、ファイルに保存されるが、その処理はWindows側でまとめて行なうため、レジストリを利用する側では、ファイルの読み書きやデータの保存のタイミングなどを意識する必要がない。また、あらかじめ定義されたデータ形式で文字列や整数値を扱えるため、API経由で入手したデータを変換するなどの手間も不要になる。
また、レジストリは、Windowsが持つハードウェアや動作状態に関する情報も同じ形式で提供し、システム情報を入手するための方法としても利用されている。こうした情報は、ファイルには保存されず、Windowsが必要に応じて自動的に作り出して、APIを介して提供している。このような情報を「揮発性」があるという。
これに対して、ファイルに保存されているレジストリ情報は、システムの電源がオフになっても、値を保持できるため、「不揮発性」であるいう。また、レジストリでは、ファイルに格納されているレジストリ情報を「ハイブ」と呼ぶ。レジストリは、複数のハイブと揮発性の情報から構成されている。
基本的にはレジストリを扱うには、WindowsのAPIを使うが、その一部は、Windows付属のレジストリエディタ(RegEdit.exe)で編集することができる。ただし、レジストリエディタが扱えるのは、レジストリの一部で、レジストリの中にはレジストリエディタでアクセスできない部分も存在する。
レジストリを構成する要素
レジストリは、ファイルシステムのフォルダのような「ツリー構造」でデータを管理している。レジストリには、このツリー構造を作るレジストリの要素を「キー」という。
「キー」は、フォルダのようなもので、その下に複数のキーを含むことができる。あるキーの下にあるキーを「サブキー」と呼び、サブキーを含むキーをサブキーの「親キー」ということがある。また、レジストリには、6つのルートキーがある。ルートキーは、キーのツリー構造の起点となる部分で、最も上にある「親キー」だ。
ルートキー |
Reg Edit |
略称 | Hive/Link | 備考 | |
---|---|---|---|---|---|
サブキー | Hiveファイル | ||||
HKEY_CLASSES _ROOT |
○ | HKCR |
HKLM\SOFTWARE\Classesと HKEY_USERS\<SID> \SOFTWARE\Classesを合成したもの |
クラス定義と拡張子の関連づけ | |
HKEY_CURRENT _USER |
○ | HKCU | HKEY_USERの下のログオンしているユーザーのサブキーにリンク | ||
HKEY_LOCAL _MACHINE |
○ | HKLM | BCD00000000 | \Boot\BCD | システム全体、ハードウェアに関する情報 |
COMPONENTS |
%SystemRoot%\System32 \Config\COMPONENTS |
||||
SYSTEM |
%SystemRoot%\System32 \Config\SYSTEM |
||||
SAM |
%SystemRoot%\System32 \Config\SAM |
||||
SECURITY |
%SystemRoot%\System32 \Config\SECURITY |
||||
SOFTWARE |
%SystemRoot%\System32 \Config\SOFTWARE |
||||
HARDWARE | 揮発性 | ||||
HKEY_CURRENT _USER |
○ | HKCU | HKEY_USERの下のログオンしているユーザーのサブキーにリンク | ||
HKEY_USERS | ○ | HKU | <SID> |
%SystemRoot%\ServiceProfiles\NetworkService\Ntuser.dat %SystemRoot%\ServiceProfiles\LocalService\Ntuser.dat \Users\ユーザー名\Ntuser.dat AppData\Local\Microsoft\Windows\Usrclass.dat |
ユーザーすべての情報 |
.DEFAULT | %SystemRoot%\System32\Config\Default | ||||
HKEY_CURRENT _CONFIG |
○ | HKCC |
HKLM\SYSTEM\CurrentControlSet \Hardware Profiles\Currentへのリンク |
||
HKEY_PERFOR MANCE_DATA |
× | HKPD | 揮発性 | パフォーマンスデータ |
キーには、かならず名前がつく。名前にはASCII文字や日本語(UTF-16LE形式)を含む文字列が利用できる。その最大長は230文字である。ただし、キーの名前に「\」を含むことはできない。キー名には、空白を含むことができるが、このような場合、扱うときにダブルクオートで括るなど、ファイルパスと同様の扱いが必要になる。
キーには、サブキーのほかに「値」を保存することができる。値は、「名前」、「種類」、「データ」という構造を持つ。つまり、情報を「種類」で指定した形式として「データ」に保存し、これに「名前」を付けるわけだ。
「種類」は、あらかじめ既定されたもののみが利用できる。システムとして定義されているデータ形式は12種類あるが、そのうち6種類だけをレジストリエディタで扱うことができる。Plug & Play用のデータ形式(Resource関連)もあるが、レジストリエディタで扱うことができるのは文字列または整数およびバイナリのみである。
API上の種類(タイプ) | RegEditでの種類 | 意味 |
---|---|---|
REG_BINARY | バイナリ値 | 特定の形式を持たないバイトデータ |
REG_SZ | 文字列値 | 改行を含まない固定長の文字列 |
REG_EXPAND_SZ | 展開可能な文字列値 | 環境変数で展開される文字列(%~%) |
REG_MULTI_SZ | 複数行文字列値 | 改行を含む文字列 |
REG_DWORD/ REG_DWORD_LITTLE_ENDIAN※1 |
DWORD(32ビット)値 | 32bit符号なし整数値(リトルエンディアン) |
REG_DWORD_BIG_ENDIAN | ー※2 | 32bit符号なし整数値(ビッグエンディアン) |
REG_QWORD/ REG_QWORD_LITTLE_ENDIAN※1 |
QWORD(64ビット)値 | 64bit符号なし整数値(リトルエンディアン) |
REG_LINK | ー | リンク。データを他のキーへのパスとして解釈 |
REG_NONE | ー | タイプなし |
REG_RESOURCE_LIST | ー | リソースリスト |
REG_FULL_RESOURCE_DESCRIPTOR | ー | リソース記述子 |
REG_RESOURCE_REQUIREMENTS_LIST | ー | リソース要求リスト |
※1:形式としては同一、※2:非リトルエンディアンのシステムで利用
同一親キーのもとでは、同じ名前を持つ「値」は1つしか存在できないが、親キーが違うなら、同名の「値」は登録可能だ。また、すべてのキーは「(既定)」という名前の「値」を持ち、「種類」は「文字列値」に固定されていて、この名前の「値」をユーザーがあとから作成することはできない。なお、名前には、日本語を含む任意の「文字」が利用できるが、長さは255文字以下となっている。
データは「種類」に応じたものが格納される。文字列の長さはAPIの仕様上は32bit値で表現(4ギガバイト)されるが、実際に扱える長さは、システムのメモリなどの状態で決まる。逆にいうと、扱える長さは、システムによって違う。レジストリの値は巨大なデータを扱うためには作られておらず、大きなデータを登録することは、システム性能の低下につながる。なお、マイクロソフトでは、2048バイト以上のデータは、ファイルに保存し、そのファイルパスをレジストリに登録することを推奨している。このため、実用上、データの長さは、2048バイト程度となる。
「値」や「キー」は、ルートキーからの「パス」で指定する。ファイルパスと同様にルートキーから目的のキーまたは「値」まで、親キーを「\」でつないで表現する。レジストリのパスを文字として表現する場合、略号を使うことがある。たとえば、HKEY_LOCAL_MACHINEは、HKLMと表現される。ただし、これは、あくまでも書籍やプログラム表示上の表記方法であって、レジストリエディタなどがインポート/エクスポートするテキストファイルなどでは、省略しない表記方法が必要となる。
レジストリのうち、ファイルに情報が記録されているキーを「ハイブ」という。レジストリの一部は、このハイブからできている。具体的には、各ユーザーの情報(HKEY_USERS)のサブキーは、それぞれがハイブになっている。また、HKEY_LOCAL_MACHINEのサブキー(HARDWAREを除く)もハイブだ。
ハイブに対応するファイルの形式は、正式には公開されていないが、インターネットなどでは解析した結果が公開されており、C#などからファイルを操作するためのライブラリなども作られているようだ。
この連載の記事
-
第427回
PC
WindowsのPowerShellのプロファイルを設定する -
第426回
PC
WindowsでAndroidスマホをWebカメラにする機能を試した -
第425回
PC
無料で使えるExcelにWord、Microsoft 365のウェブ版を調べた -
第424回
PC
Windowsの基本機能であるクリップボードについてあらためて整理 -
第423回
PC
PowerShellの今を見る 2つあるPowerShellはどっち使えばいい? -
第422回
PC
Windows 11の目玉機能が早くも終了、Windows Subsystem for Android(WSA)を振り返る -
第421回
PC
進化しているPowerToys LANで接続したマシンでキーボード/マウス共有機能などが追加 -
第420回
PC
Windowsプレビュー版に搭載されたsudoを試す -
第419回
PC
Windows Insider Previewが変わって、今秋登場のWindows 11 Ver.24H2の新機能が見えてきた? -
第418回
PC
Windows 11のスマートフォン連携は新機能が追加されるなど、いまだ進化している -
第417回
PC
Windows 11のスマートフォン連携機能をあらためて使ってみる - この連載の一覧へ