雑記帳

整理しない情報集

更新情報

レジストリの基礎知識

公開日:

カテゴリ: Windows

Windowsのレジストリの基礎知識についてまとめました。

レジストリとは

レジストリはWindows OSにおける各種設定を保存するデータベースです。ファイルに設定を記録するより遥かに高速に動作します。Windows上で動作するものであれば、システムからサードパーティ製のアプリケーションまで、幅広く使用されます。

レジストリはシステムに統合されており、可搬性はありません。ポータブルと呼ばれるアプリケーションはレジストリを使用せず、設定をファイルに書き出します(あるいは設定を保存しません)。

値データ

レジストリはキーと呼ばれる仮想的なディレクトリによって階層構造になっており、キー内にKey-Value方式で値を格納します。各キーには1つの名前の無い文字列値(レジストリエディタでは(既定)と表示される)が存在します。

値はデータ型が存在し、型によって格納できるデータが決まっています。

データ型型名格納できる値
文字列値REG_SZ任意の文字列値
バイナリ値REG_BINARY任意のバイナリ値
DWORD(32ビット)値REG_DWORD32ビットの数値
QWORD(64ビット)値REG_QWORD64ビットの数値
複数行文字列値REG_MULTI_SZ改行を入力可能な文字列値
展開可能な文字列値REG_EXPAND_SZ環境変数等の展開可能な文字列を含む文字列値

レジストリの構造

レジストリはコンピュータを起点として、以下のキーを持ちます。省略記法が存在するキーは、キー名の代わりに省略記法でもアクセスできます。

キー名省略記法内容
HKEY_CLASSES_ROOTHKCR関連付け等の設定
HKEY_CURRENT_USERHKCU現在のユーザの設定
HKEY_LOCAL_MACHINEHKLMコンピュータの設定
HKEY_USERS各ユーザの設定
HKEY_CURRENT_CONFIGHKCCハードウェアの設定

HKEY_CLASSES_ROOT(HKCR)

HKEY_CLASSES_ROOT(HKCR)は実際にその名前のキーは存在せずHKCU\Software\ClassesHKLM\Software\Classesを結合したビューです。両方に存在する場合はHKCUが優先されます。

主にファイルやプロトコルの関連付け設定の参照に使用します。関連付け設定ではユーザがインストールしたアプリケーションと全ユーザに向けて管理者がインストールしたアプリケーションの両方が見える必要があり、このキー配下を見ることで実現できます。

このキー配下を編集すると、HKCU\Software\Classes側に存在するものはHKCU側が、それ以外のものはHKLM側の値が編集されます。環境によって編集される実体が異なる関係上、ややこしく事故の元であるため、基本的にはこのキーは編集しないでHKCUHKLMSoftware\Classesを編集したほうが良いでしょう。

HKEY_CURRENT_USER(HKCU)

現在操作しているユーザのレジストリです。そのユーザの設定や、そのユーザが動作させているアプリケーションの設定が格納されています。このキー配下を編集する際は特権は必要ありません。

実体はHKEY_USERSキー内の自身の識別子のキーです。

HKEY_LOCAL_MACHINE(HKLM)

コンピュータ全体の設定や、全ユーザ共通の設定が格納されています。グループポリシーなどもこのキー配下で設定します。

HKEY_USERS

現在操作しているユーザの他、他のサインインしているユーザ、新規ユーザのデフォルト、その他一部システムユーザのレジストリがそれぞれ格納されています。サインイン時にロードされて表示されるようになるため、サインイン状態でない他のユーザのレジストリは表示されません。

HKEY_CURRENT_CONFIG(HKCC)

HKEY_CURRENT_CONFIG(HKCC)は実際にその名前のキーは存在せず、HKLM\System\CurrentControlSet\Hardware Profiles\Currentのエイリアスとなっています。ハードウェア関連の設定が格納されています。

実体の保存先

各ユーザ(HKEY_USERS)のレジストリは%USERPROFILE%\NTUSER.DATに保存されます。大抵はユーザのサインアウト時にファイルに書き込まれるようです。

コンピュータのレジストリは%SYSTEMROOT%\System32\config内に保存されます。ユーザには読み取りを含めてアクセス権は与えられておらず、特権でアクセス権を取得するかセーフモードでなければ中身は覗けません。

レジストリの編集

レジストリを編集する方法は様々ですが、直接編集する方法のうちWindows標準で利用できる代表的なものは以下の通りです。

レジストリエディタ(regedit)

GUIで編集するレジストリの管理ツールです。おそらくユーザがレジストリを触る方法としては最もメジャーなものでしょう。

  • アドレスバーにレジストリキーのパスを入力してEnterを押下すると、そのキーへ移動可能
    • HKCUHKLMなどの省略記法も自動で展開される
  • 値の設定時に10進数と16進数の選択/相互変換が可能(格納される値はどちらでも同じ)
  • キーのコンテキストメニュー(右クリックメニュー)から、特定のキーをエクスポート可能
  • キーのコンテキストメニュー(右クリックメニュー)から、キーのアクセス許可を変更可能

regファイル

レジストリの内容をファイルに書き出したものです。正確にはレジストリエディタ(regedit)の機能の一部であり、regファイルはレジストリエディタに関連付けられています。レジストリエディタでエクスポートするとこの形式で出力されます。

ファイルフォーマットはiniファイルに近く、[キーのパス]でセクション、その後ろにそのキー内のKey-Valueを入力します。

名前の無い文字列値は値名を@、値を削除するには値を-、キーを削除するにはキーのパスの先頭に-を指定します。キーの削除は配下のサブキーもすべて削除されます。

Windows Registry Editor Version 5.00

; フォーマットサンプル (文字列値の場合は型名が不要)
; [キーのパス]
; 値名=型名:値

; キーの追加・指定
[HKEY_CURRENT_USER\Software\MyApp]

; 値の追加・設定
[HKEY_CURRENT_USER\Software\MyApp]
"MyString"="my string"
"MyDword"=dword:00000001
@="No name attribute"

; 値の削除
[HKEY_CURRENT_USER\Software\MyApp]
"MyString"=-
"MyDword"=-

; キーの削除
[-HKEY_CURRENT_USER\Software\MyApp]

regコマンド

主にコマンドラインでレジストリを操作するためのツールです。バッチファイル等で自動化する場合に便利です。

/fオプションが無い場合は確認プロンプトが表示されます。名前の無い文字列値は/veオプションで設定できます。

rem キーの追加
reg add "HKCU\Software\MyApp" /f

rem 値の追加
reg add "HKCU\Software\MyApp" /v "MyString" /d "my string" /f
reg add "HKCU\Software\MyApp" /v "MyDword" /t REG_DWORD /d 1 /f
reg add "HKCU\Software\MyApp" /ve /d "No name attribute" /f

rem 値の削除
reg delete "HKCU\Software\MyApp" /v "MyString" /f
reg delete "HKCU\Software\MyApp" /v "MyDword" /f

rem キーの削除
reg delete "HKCU\Software\MyApp" /f

その他、regファイルをインポート・エクスポートしたり、他のレジストリの本体ファイル(NTUSER.DATなど)をロードして編集することもできます(reg load/reg unloadコマンド)。

PowerShell

PowerShellではレジストリ単体として操作するコマンドではなく、ファイルの属性等の様々なプロパティを変更するコマンドの一部として提供されています。

名前の無い文字列値は値名を(Default)にすることで設定できます(大文字小文字は区別しません)。

# キーの追加
New-Item -Path "HKCU:\Software\MyApp"

# 値の追加(新規の場合は"New-ItemProperty"でも可)
Set-ItemProperty -Path "HKCU:\Software\MyApp" -Name "MyString" -Value "my string"
Set-ItemProperty -Path "HKCU:\Software\MyApp" -Name "MyDword" -Value 1
Set-ItemProperty -Path "HKCU:\Software\MyApp" -Name "(Default)" -Value "No name attribute"

# 値の削除
Remove-ItemProperty -Path "HKCU:\Software\MyApp" -Name "MyString"
Remove-ItemProperty -Path "HKCU:\Software\MyApp" -Name "MyDword"

# キーの削除
Remove-Item -Path "HKCU:\Software\MyApp"

参考

カテゴリ: Windows