Windows & Microsoft技術 基礎 Advent Calendar 2015 の5日目です。
Windows OSに独特にものの一つにレジストリがあるわけですが、いままでなんとなくKey-Value形式のデータベースで、Windowsのなんか大事なデータを格納しているもの、という程度の認識だったので、せっかくなのでざっくりながらまとめてみることにしました。 たぶん2,3回にわたって不定期に続きます。
レジストリの背景と目的
Windows 3.1 では、各種プログラムやドライバーの設定を管理するのに同じフォルダにおいたini
ファイルを使っていました。このiniファイルは各PCごとのHWに関するような個別の情報も含んでいたため、あるPC用に設定したiniファイルを別のPCにもっていくと動かないということが起きていました。そこでMicrosoftが導入したのがレジストリです。個々に散らばっていたiniファイルに書かれた情報を一元監視するものです。
レジストリは階層構造を持ったKey-Value型のシンプルな構造をとっています。このシンプルさゆえに、Keyの数が増えても高速に読み書きできています。またOSがバージョンアップするにつれより堅牢に、セキュアになってきました。例えば UAC(User Account Control)の導入もレジストリの保護に寄与しています。
レジストリファイルの実態
主要なレジストリファイルは%SYSTEMROOT%\System32\Config
にあります。
この中では、SAM, SECURITY, SYSTEM, SOFTWARE, DEFAULT といったファイルがレジストリの実態です。またユーザーごとの設定情報として、 %USERPROFILE%\ntuser.dat
と %USERPROFILE%\AppData\Local\Microsoft\Windows\UsrClass.dat
というファイルもあります。どのファイルにどんなデータが入っているかは次のKeyの種類で説明します。
また、これらのファイルはバイナリ形式なのでテキストエディタで開いても内容を確認できません*1。ツールを通すことで、.reg ファイルといったテキスト形式に書き出し・読み取りができます。
Keyの種類
レジストリはKey-Value型かつ階層構造を取っていますが、大きく5つに分かれています。
HKEY_CLASSES_ROOT (HKCR)
このキーにはアプリケーションの関連付け情報やOLEオブジェクトのクラスIDといった情報が登録されています。このキーは HKEY_LOCAL_MACHINE\Software\Classes
とHKEY_CURRENT_USER\Software\Classes
をマージしたものであり、HKEY_CURRENT_USER\Software\Classes
と重複して登録されている場合はHKEY_CURRENT_USER\Software\Classes の方をマスターとしてWindowsは参照します。
HKEY_CURRENT_USER (HKCU)
ntuser.dat に格納されているデータです。これは現在サインイン中のユーザーに関する情報、例えばユーザーフォルダの場所やコントロールパネルの設定などが記述されています。
HKEY_LOCAL_MACHINE (HKLM)
さらにいくつかのグループに分けられます。
- SAM
Security Accounts Manager
のデータであり、SAMファイルに格納されています。多くの場合、Administrator権限で見る限りは空になっています*2。
- SECURITY
SECURITYファイルに格納されていますが、ここも多くの場合、Administrator権限で見る限りは空になっています*3。
- SYSTEM
SYSTEMファイルに格納されています。Windowsのセットアップや設定、マウントされているデバイスといった情報が格納されています。
- SOFTWARE
SOFTWAREファイルに格納されています。インストールされているソフトウェアに関するデータです。Microsoftが管理しているデータ (HKLM\Software\Microsoft
)の他、ソフトウェアを提供しているベンダーも利用しています。
HKEY_USERS (HKU)
現在ロードされているユーザープロファイルに関する情報です。HKU.DEFAULT キーの情報はDEFAULTファイルに格納されています。
HKEY_CURRENT_CONFIG (HKCC)
こちらのデータもSYSTEMファイルに格納されています。こちらはハードウェアに関するプロファイル情報、例えばディスプレイ解像度やプリンターに関する情報を格納しています。
値型の種類
Key-Value 型のValueはいくつかデータ型が用意されています。主なものは以下
REG_BINARY
: binary型REG_DWORD
: 32bit整数REG_SZ
: 固定長整数REG_EXPAND_SZ
: 可変長文字列REG_MULTI_SZ
: 複数行のリスト形式文字列REG_FULL_RESOURCE_DESCRIPTOR
: ネストした配列REG_LINK
: 他のレジストリキーへのシンボリックリンクREG_NONE
: 特定の型なし1REG_QWORD
: 64bit整数
レジストリを操作するツール
生のファイルはバイナリ形式になっているため、ツールを使ってレジストリを操作します。
RegEdit
OS標準のGUIツール。Windows 10 TH2 でアイコンがフラットになりました。
左のペインで階層構造になってキーを一覧でき、その値を右側のペインで管理できます。 値の変更や、regファイルへのインポート・エクスポート、レジストリへのアクセス許可の確認・編集といった一通りの操作が可能です。
reg.exe
コマンドラインです。レジストリ関連の操作を自動化するときなどに使えそうですが、個人的には次のPowerShellで全部やっていたので、今回初めて知りました...
PowerShell
PowerShell でもレジストリの管理ができます。Keyの補完もできるのでかなり使いやすいです。
> Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell Path : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe ExecutionPolicy : RemoteSigned PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Micro soft.PowerShell PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds PSChildName : Microsoft.PowerShell PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry
> Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell -Name "Exe cutionPolicy" -Value RemoteSigned
ProcessMonitor
ProcessMonitor を使うとレジストリへのアクセスを可視化することができます。
レジストリクリーナー
そのほか、無償もしくは有償のレジストリクリーナーといわれる種類の、Microsoft以外が提供しているレジストリをチェック・更新するツールもあります。 これらの種類のツールが有益なのかどうか、危険なのかどうかについては触れませんし、利用される場合は個人の責任でお願いします。