レジストリと regtool
regtool は Windows のレジストリを編集するための Cygwin 付属ツールです。意外と便利に使えるのですが、世間では殆ど利用されていないように見受けられるので、解説めいたものを書いてみました。
本文書の半分以上はただ単に Windows のレジストリについて解説しているものです。 レジストリに対する充分な知識があり、手っ取り早く regtool の利用法だけを知りたいのであれば、 「regtool とは何か」から読み進めればよいでしょう。
レジストリに関する予備知識
レジストリとは何か
Cygwin を使うような人には今更の感もありますが、 「レジストリ」とは、Windows が提供するシステム定義のデータベースです。 アプリケーションやシステムコンポーネントはこの中に各種設定用のデータを格納します。 Microsoft による説明としては、「Microsoft Windows レジストリの説明」が入口として適切でしょう。
レジストリは階層化されたツリー構造中にデータを蓄えています。 ツリー中の各ノードは「キー(key)」と呼ばれ、各キーの中にはサブキー、及び「エントリ」と呼ばれる実際のデータ(後述)が格納されます。勿論、キーの中には複数個のサブキーやエントリが格納出来ます。
この構造は Windows のファイルシステムと対比させると分かりやすいかもしれません。
事前定義キー(下記参照)がドライブ、キーがディレクトリ、
エントリがファイル、エントリに格納されている実際の値がファイルの内容です。
Windows のファイルシステムにおける階層構造の区切り文字と同様、
レジストリの階層構造の区切り文字にも「\」が利用されます。
ただ、regedit.exe(「Windows 標準のレジストリ編集ツール」 を参照)を利用していると「事前定義キーはドライブである」という考え方はピンと来ないかもしれません。 Windows 2000 までの NT 系 Windows であれば、regedt32.exe を使えば一目瞭然でしたが(*1)、 Windows XP 以降は regedt32.exe と regedit.exe は同じプログラム(*2)になってしまったので、この手ももう使えません。
*1: regedt32.exe を起動したとしても、Windows 3.1 時代のファイルマネージャの存在を知らなければ、やはりピンと来ないかもしれません
*2: regedt32.exe は、内部的に regedit.exe を起動するようになったようです。
事前定義キー
アプリケーションがキーを開くためには、 そのキーが既にレジストリ中に存在していなければなりません。 しかしキーを作成するには、 そのキーをサブキーとして含むキーが既にオープンされていなければなりません。 先の対比で言えば、ディレクトリを作成するには、 そのディレクトリを格納する別のディレクトリが必要になるということです。
レジストリ中には「事前定義キー(predefined key)」と呼ばれる、常時オープンされているキーがあります。 このキーは既に述べた通り、Windows ファイルシステムで言えば「ドライブ」に相当するものです。 これには以下のようなものがあります。
- HKEY_LOCAL_MACHINE
-
バス、メモリ、インストールされているハードウェアなど、計算機の物理状態が格納されています。 「HKLM」と省略されることがあります。
- HKEY_USERS
-
現在ログオンしているユーザに関する各種設定(環境変数、色、プリンタ、ネットワーク、アプリケーションの初期設定)と、デフォルトのユーザ設定が含まれています。 ログオンしているユーザの設定は、各ユーザの SID がキー名となったキーの下に格納されていますが、 ログオンしていないユーザの情報は読み込まれません。デフォルトのユーザ設定 (「.DEFAULT」として格納されています)は未ログオン状態での設定情報として使われますが、 新規にユーザを作成した場合の雛形としても使われるようです。「HKU」と省略されることがあります。
- HKEY_CURRENT_USER
-
レジストリを参照したユーザの設定が参照出来るように用意されているキーです。 HKEY_USERS のサブキーであり、実際には HKEY_USERS に含まれるユーザ設定に対するリンクとなっています。 即ち、このキーの下に含まれるデータを変更した場合、その変更は HKEY_USERS 以下にある当該ユーザの情報にも反映されることになります(逆もまた真です)。 「HKCR」と省略されることがあります。
- HKEY_CURRENT_CONFIG
-
現在のハードウェアプロファイルに関する情報が含まれています。 このキーの下に含まれている情報は、この計算機における標準的なハードウェアに関する情報 (HKEY_LOCAL_MACHINE 以下に格納されています)と、現在のハードウェアプロファイルの間の差分だけです。 「HKCC」と省略されることがあります。
- HKEY_CLASSES_ROOT
-
ドキュメントのタイプ(又はクラス)と、そのタイプに割り当てられたプロパティが格納されています。 このキーの下の情報は、HKEY_LOCAL_MACHINE と HKEY_CURRENT_USER の内容をマージしたものとなっています。「HKCR」と省略されることがあります。
- HKEY_DYN_DATA
-
Windows 95/98/Me において、パフォーマンスデータ収集用に利用される情報が格納されています。
- HKEY_PERFORMANCE_DATA
-
Windows NT/2000/XP において、パフォーマンスデータ収集用に利用される情報が格納されています。
実際にレジストリに格納されているわけではありませんが、
このキーに対してレジストリ操作を行うと、システムからデータが収集されます。
UNIX 系 OS の
/procファイルシステムに似ていると言えば似ているかもしれません。
エントリ
エントリとはレジストリ中に格納される実際のデータの入れ物で、それぞれ名前(エントリ名)を持っています(*3)。
例えば、「CYGWIN」という名前のエントリには、文字列型の値として
「tty」というデータを入れることが出来ます。エントリに格納可能な値の型については後述します。
「エントリは名前を持っている」と書きましたが、実は各キーの中には一つだけ、名前を持たないエントリを格納することが出来ます。 Windows 附属のレジストリエディタ(regedt32.exe または regedit.exe)で 「(標準)」或いは「(既定)」と表示されるエントリは、この「名前を持たないエントリ」です。 この文書ではこれ以降、この「名前を持たないエントリ」のことを「既定のエントリ」と表現します。
*3: Windows 附属のレジストリエディタ(regedt32.exe または regedit.exe)は、エントリを単に「値(value)」と呼んでいます。
値の型
個々のエントリに格納されるデータの形式は様々なので、レジストリにデータを格納する際は、 どのような形式(データ型)でデータを格納するかを指定することが出来ます。以下にその一覧を示します。
レジストリに格納される文字列は ANSI 文字列か Unicode 文字列でなければなりませんが、Windows が提供するレジストリ操作関数群を利用すればその辺りの処理は「良きに計らって」くれます。
- REG_BINARY
- 任意の形式のバイナリデータ。日本語版 Windows では「バイナリ値」となります。
- REG_DWORD / REG_DWORD_LITTLE_ENDIAN
- リトルエンディアン形式の 32 ビット数。日本語版 Windows では「DWORD 値」となります。
- REG_DWORD_BIG_ENDIAN
- ビッグエンディアン形式の 32 ビット数。 恐らく、現在は存在しない MIPS 版 / PowerPC 版 / Alpha 版 Windows NT で使われていたと思われます(これらの MPU は、いずれもビッグエンディアンを採用していました)。
- REG_SZ
- NUL 文字で終端された文字列。日本語版 Windows では「文字列値」となります。
- REG_EXPAND_SZ
- NUL 文字で終端された文字列だが、「
%PATH%」などのように、 変数への展開が行われていない参照が入っているもの。 実際に値を利用する時点で、変数が展開されます。 例えば「%SYSTEMROOT%\system32」は、 一般的な環境では「C:\WINDOWS\system32」などとなります。 日本語版 Windows では「展開可能な文字列値」となります。 - REG_LINK
- シンボリックリンク名を指定する Unicode の文字列。
- REG_MULTI_SZ
- NUL 文字で愁嘆された文字列の配列(配列の終端は 2 つの NULL)。日本語版 Windows では「複数行文字列値」となります。
- REG_RESOURCE_LIST
- デバイスドライバのリソースリスト。
- REG_NONE
- 定義された値の型がないもの。
Windows 標準のレジストリ編集ツール
Microsoft が標準的に提供するレジストリ操作ユーティリティは二つあります。 regedit.exe と regedt32.exe です。Windows 9x には前者しか存在しませんが、NT 系では両方が存在します。 どちらの名前も「レジストリ エディタ」なので紛らわしいことこの上ありませんが、 機能的には大きな違いがあります。端的に言えば、regedit.exe は Windows 9x でしか使えません(でした)。
Windows 95 から登場した「エクスプローラ」然とした外見を持つ regedit.exe の外見からすると、Windows 3.1 時代の「ファイルマネージャ」然とした外見の regedt32.exe は、いかにも古臭くて引退寸前の印象を受けます。一見、最近の Windows アプリケーション的な操作感を持つ regedit.exe のほうが、旧来の Windows でよく利用されていた、古臭い MDI のイメージを色濃く残す regedt32.exe よりも高機能に見えます。 世間一般的には regedit.exe のほうが広く使われており、regedt32.exe は「昔から NT を利用している人間が細々と利用しているもの」などと受け取られている向きもあるようですが、regedit.exe を NT/2000 でのレジストリ編集用に利用してはいけません。 regedit.exe は Windows 9x 用のレジストリエディタとして位置付けられており、NT の管理には利用出来ないからです。
regedit.exe は NT のレジストリに対して可能な全ての操作が出来るわけではなく、 しかも扱えるデータ型に制限があります。公式には、以下の制限があるとされています。 従って、NT 上では検索用途に限定して regedit.exe を利用すべきでしょう。
- レジストリキーに対するセキュリティ設定が行えません。 NT にはレジストリキーに対するセキュリティ設定という概念がありますが、Windows 9x には存在しないためです。
- REG_EXPAND_SZ 及び REG_MULTI_SZ の表示と編集が出来ません。 regedit.exe はこれらのデータ型を REG_BINARY として扱い、編集後は REG_SZ として保存してしまいます。
このような煩わしい問題は、Windows XP でようやく解消されました。 Windows XP では、regedit.exe が唯一無二のレジストリ編集ツールとなり、レジストリキーに対するセキュリティの設定や、REG_EXPAND_SZ / REG_MULTI_SZ の編集も可能となっています。
「既定のエントリ」の扱い
先に紹介した「既定のエントリ」の扱いは、Windows のアーキテクチャによって多少異なります。
- Windows 95/98(恐らく Me も)では、各キーには必ず既定のエントリが存在します。 また、既定のエントリのデータ型はREG_SZ に固定されています(Windows 98 以降では、変更することも可能です)。
- NT 系 Windows では、既定のエントリは明示的に作成しない限り存在しませんが、作成する場合は、任意のデータ型を選択することが可能となっています。
既定のエントリに対する処理は、regedit.exe / regedt32.exe でも異なっています。 regedt32.exe では、既定のエントリが存在しなければ、それを表示することはしません。 一方、regedit.exe は、既定のエントリが存在しようとしまいと、常に 「(標準)」或いは「(既定)」というキーを表示しようとします。
NT 系 Windows で、既定のエントリが実際に存在するかしないかを見分けるのは比較的簡単です。
- 既定のエントリが存在しない場合、regedit.exe はデータとして「(値の設定なし)」という文字列を表示します。regedt32.exe は何も表示しません。
- 既定のエントリが存在する場合、regedit.exe / regedt32.exe 共に、データとして実際のデータを表示します。データが空文字列であった場合は、何も表示されません。
regtool とは何か
レジストリについてダラダラと書いてきましたが、ようやく本題です。
regtool は cygwin パッケージに含まれているツールで、 レジストリの内容をコマンドラインから操作することが出来ます。 シェルスクリプト中から利用出来るので、 定型的なレジストリ操作に威力を発揮することでしょう。
編集出来るデータ型は REG_SZ、REG_DWORD、REG_EXPAND_SZ、REG_MULTI_SZ だけです。 REG_BINARY が編集出来れば regedt32.exe と同等の編集能力を発揮できるのですが、 さすがにコマンドラインから使う以上、 バイナリデータは厳しいのかもしれません。
キーの指定は「\事前定義キー名\キー名」、エントリに対する値の指定は「\事前定義キー名\キー名\エントリ」として行います。
また、各種の事前定義キーの代わりに以下の短縮形が利用可能です。
| 事前定義キー | 省略形 |
|---|---|
| HKEY_CLASSES_ROOT | root 又は HKCR |
| HKEY_CURRENT_CONFIG | config 又は HKCC |
| HKEY_CURRENT_USER | user 又は HKCU |
| HKEY_LOCAL_MACHINE | machine 又は HKLM |
| HKEY_USERS | users 又は HKU |
例えば、「\HKEY_CURRENT_USER\software\Microsoft\Clock\iFormat」
は「\user\software\Microsoft\Clock\iFormat」
のように表現出来ます。
regtool のサブコマンド
regtool の動作は、サブコマンドを利用して決定します。
list: キー / 値の一覧表示
list は、
指定されたキー中に存在するサブキー又は値の一覧を表示します。
ファイルシステムとの対比で言えば「ls」に相当します。
ただ単にサブコマンドとして list を指定した場合、
指定されたキー中のサブキーと値の両方を表示します。
以下のオプションが指定可能です。
-k- 指定されたキー中のサブキーだけを表示します。
-l- 指定されたキー中の値だけを表示します。
-p- サブキーに「\」を付与して表示します。 「ls -p」を実行した際に、ディレクトリの最後に 「/」が付与されるイメージを想像してもらうと分かりやすいでしょう。
以下に例を挙げます。
$ regtool.exe -p list '\user\Identities' $ regtool.exe list '\user\Environment'
add: 新しいサブキーの追加
addは、指定されたキーを追加します。
ファイルシステムとの対比で言えば「mkdir」に相当します。
以下のようにして利用します。
$ regtool.exe add '\HKCU\Environment\hogege'
remove: サブキーの削除
removeは、指定されたキーを削除します。
ファイルシステムとの対比で言えば「rmdir」に相当します。
rmdir 同様、中にサブキーや値が含まれているキーは削除出来ません。
$ regtool.exe remove '\HKCU\Environment\hogege'
get: 指定された値の表示
getは、指定された値の内容を表示します。
ファイルシステムとの対比で言えば「cat」に相当します。
$ regtool.exe get '\HKCU\Environment\HOME'
set: 値の追加
setは、指定された値の内容を表示します。
ファイルシステムとの対比で言えば「cat >」に相当します。
以下のオプションを利用して、格納するデータのデータ型が指定可能です。
-s- REG_SZ
-i- REG_DWORD
-e- REG_EXPAND_SZ
-m- REG_MULTI_SZ
$ regtool.exe -s set '\HKCU\Environment\PAGER' 'less' $ regtool.exe -i set '\HKCU\Environment\DWORD' 10 $ regtool.exe -e set '\HKCU\Environment\EXPAND '%HOME%\hogege'
REG_MULTI_SZ についてはどのように設定すればよいか分からなかったのですが、 ソースを読んだところ、次のようにスペースで区切って指定すれば良いようです。
$ regtool.exe -m set '\HKCU\Environment\MULTI' val1 val2 val3
既定のエントリに値を設定するには、キー名の最後に「\」を付与します。
$ regtool -s set '\root\Folder\shell\Bash\' 'Run Bash'
unset: 値の追加
unsetは、指定された値を削除します。
ファイルシステムとの対比で言えば「rm」に相当します。
$ regtool.exe unset '\HKCU\Environment\PAGER'