銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

レジストリについてざっくりまとめてみた (1)

Windows & Microsoft技術 基礎 Advent Calendar 2015 の5日目です。

qiita.com

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にあります。

f:id:tanaka733:20151204013905p:plain

この中では、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\ClassesHKEY_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: 特定の型なし1
  • REG_QWORD: 64bit整数

レジストリを操作するツール

生のファイルはバイナリ形式になっているため、ツールを使ってレジストリを操作します。

RegEdit

OS標準のGUIツール。Windows 10 TH2 でアイコンがフラットになりました。

f:id:tanaka733:20151204222505p:plain

左のペインで階層構造になってキーを一覧でき、その値を右側のペインで管理できます。 値の変更や、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 を使うとレジストリへのアクセスを可視化することができます。

technet.microsoft.com

f:id:tanaka733:20151204222522p:plain

レジストリクリーナー

そのほか、無償もしくは有償のレジストリクリーナーといわれる種類の、Microsoft以外が提供しているレジストリをチェック・更新するツールもあります。 これらの種類のツールが有益なのかどうか、危険なのかどうかについては触れませんし、利用される場合は個人の責任でお願いします。

参考資料

*1:一般的に多くの人にとっては

*2:コメントを頂いたので修正

*3:コメントを頂いたので修正