2006年02月12日 - Windowsのレジストリ(Registry)におけるハイブ構造とSID

 レジストリはWindows OSやアプリケーションなどの各種設定を一まとめにし、統括的に管理するものである。Windowsの仕組みをより深く理解するためには、このレジストリについての知見は欠かせず、そして必須のものである。
 レジストリの編集はWindowsのカスタマイズや最適化・またウイルス感染後の修復作業など様々な場面にて求められる操作である。
 通常はWindowsのレジストリエディタより操作するのだが。Windows2000/XPで・またXP HomeEditionとProfessionalで設定が異なったり、また正しい設定をしたにも関わらず何らかの理由で反映されなかったり、極めて稀には手動で削除した値が(何故か)再作成できなくなる場合もある。そのためレジストリの編集には最大限の注意を払い、そして自己責任で行ってもらいたい。

 また断りが無い限りは、ドメインではなくWorkgroup構成でセットアップされたWindows XPを対象とし掲載する。

レジストリとハイブ(hive)・ハイブファイル


 さて、レジストリのハイブ構造(Hive Structure)とハイブファイルを本格的に説明すればあまりにも冗長な内容となるので、簡単に。
 レジストリの実体は(一部を除き)ハイブファイルと呼ばれるファイルである。レジストリエディタにて目にするレジストリは、ハイブファイルをロードしたものである。

 なおレジストリの構造上での「ハイブ」と、世間で言う所の「ハイブ(ファイル)」は混同しないよう注意を払う必要がある。

レジストリの構造と名称、ハイブ(Hives)


 ここではレジストリ構造(Microsoft)また英語版のRegistry Overview(Microsoft)を元にして説明する。
 マイクロソフトが例示した[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control]を見てみよう。
 まずレジストリエディタの左ペインより。

 「HKEY_LOCAL_MACHINE」はサブツリー(Subtrees)とMicrosoftは表記しているが、ルートキーなどの名称で扱われる場合もある。
 「SYSTEM」は「キー(Keys)」。
 「CurrentControlSet」と「Control」はサブキー(Subkeys)、つまりキーに格納されるからサブキーなのだが。ネット上の情報ではサブキーをキーと呼ぶ例もあり、時にキーとサブキーの区分けは明瞭ではない。
 サブツリーはHKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USERS、HKEY_CURRENT_CONFIGの5つとなる。

 どこまでがキーでどこからがサブキーなのか。これはMicrosoftの文書でも扱いが異なる例がある。ポリシー レジストリ エントリ (デフォルト ユーザー)(Microsoft)にてはHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policiesがキー、Explorerをサブキーとして取り扱っている。

 ではレジストリエディタの右ペインを。

 ここに表示されるDWORD値やバイナリそのものは、「値エントリ(Entries)」である。
 値エントリそれぞれの名称は「エントリ名(Entry names)」。これのタイプは「データ型(データタイプ:Data Types)」、また値エントリに設定された値は「値(Values)」である。
 「値を作成・設定し」などのガイドを読み違え、エントリ名と値を混同するミスが散見される。レジストリを編集する際には気をつけてもらいたい。

 データ型(データタイプ)としてはREG_SZ(文字列値)、REG_BINARY(バイナリ値)、REG_DWORD(DWORD値)、REG_MULTI_SZ(複数行文字列値)、REG_EXPAND_SZ(展開可能な文字列値)の5つが代表的なのだが、これ以外にもREG_FULL_RESOURCE_DESCRIPTO(?)やREG_UNKNOWN(?)などマイナーなものも存在する。

 さて、ここで一つ謎が残る。[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control]及びその下位に格納された値エントリと値までを含め、何と呼ぶのだろうか?
 マイクロソフトはこれを「ハイブ(Hives)」と呼ぶ。
 これには以下のような議論も存在する。つまりツリー構造を指す用語なのか、また個別の内容を指すのかと。

 文献などによっては、特定のキーとサブキーで識別される一連の値を指して「ハイブ」と呼んでいるものもあるようだが、本来ハイブとは、このようにレジストリの内部的な構造を指す用語であり、このような使い方は厳密には正しくない。
@IT:Insider's Computer Dictionary [ハイブ]

 ちなみに自分は値エントリの値までを含めた(構造ではなく)内容を、レジストリエントリ(Registry Entries)と呼んでいる。

ハイブファイル


 詳しく後述するが、レジストリはハイブファイルを元に作成され、もしくはそれを更にコピーしエイリアス(複製)として作成される。つまり「実体となるハイブファイルが存在する」のだ。
 例外としてHKEY_LOCAL_MACHINE\Hardwareはハードウェア環境に基づきOS起動時に作成される、動的なレジストリのキーである。言い換えればこれは「ハイブファイルが存在しないレジストリキー」なのだ。
 そのような理由にてHKLM\Hardwareは「ハイブ」ではないとの説があったはずなのだが、Microsoftのサポート技術情報などを探したものの、そのような記載が見つからない(どなたかご存知だろうか?)。

変わったハイブファイル



  • SAV:Windows OSをインストールした際の情報。何に使われるんだろうか。
  • LOG:レジストリの内容が変更された際に、変更点を一時的に保存したファイルであり、その内容は後になってから対応するハイブファイルへ書き込まれる。
  • System.alt:Systemファイルの非常用コピー。WindowsNT/2000にはあったが、XPには存在しない。
  • AppEvent.Evt:イベントログのアプリケーションログ
  • SecEvent.Evt:イベントログのセキュリティログ
  • SysEvent.Evt:イベントログのシステムログ

 (evtファイルはハイブファイルではないとされる場合もある。これはイベントビューアにて内容を確認できる。)

Windowsにおけるレジストリ(Registry)のツリー構造


 以下に5つのサブツリーを示す。大まかな言い回しをすればこれらのうち3つはエイリアス(コピー)であるため、実体があるのはHKU、HKLMの2つとなる。
 なおエイリアスの内容を編集すれば、元の(コピー元となっている)レジストリにおけるハイブファイルの内容も変更されるだろう。

HKEY_CLASSES_ROOT(HKCR)


 HKLM\Software\ClassesとHKCU\Software\Classesをコピーしたもの。大部分はHKLMの方に格納されており、後者はほぼ空である。
 ファイル形式の関連付けなどの情報を格納。

 稀にこの関連付け情報を改変し、exeファイルやcomファイルの起動を妨害するウイルスが存在する。これに対しSymantec社は「shell\open\command レジストリキーのリセットツール」を公開している。これはHKLM\Software\Classesへ登録されているbat、com、exe、pif、reg、scrファイルの関連付けを初期値へ修正するものだ。

 また「HKEY_CLASSES_ROOT\*file\shell\open\command」の値エントリの値として登録されているアプリケーションをウイルスの実行ファイルに変更し、テキストや画像ファイルを開くたびにウイルスが起動するよう改変される例もある。

HKEY_LOCAL_MACHINE(HKLM)


 システム・ハードウェア関連情報を含む。SystemハイブファイルはOS起動時に読み込まれる。

  • HKLM\HARDWARE

    • これはOS起動時にハードウェアを認識し一時的に作成されるものであり、実体のあるハイブファイルよりロードされるものではない。

  • HKLM\SAM

    • C:\WINDOWS\system32\config\SAMが相当。バックアップファイルはSAM.LOG。
    • レジストリエディタより操作できず、内容は非表示。
    • SAM(Security Account Manager)ファイルには、ユーザー及びグループ関連情報やパスワードのハッシュが含まれる(パスワードそのものが保存されるのではない)。
    • パスワードを忘れた際にSAM(ハイブ)ファイルを削除すれば何とかなるとの説があるが、一時的アカウントが作成されるものの、結局どうにもならない。

  • HKLM\Security

    • C:\WINDOWS\system32\config\SECURITYが相当。バックアップファイルはSECURITY.LOG。
    • レジストリエディタより操作できず、内容は非表示。
    • ローカルセキュリティポリシーにおけるアカウントポリシーやローカルポリシー等の設定を格納する。
    • HKLM\SAMのコピーを内部に含む。

  • HKLM\SOFTWARE

    • C:\WINDOWS\system32\config\softwareが相当。バックアップファイルはsoftware.LOG。
    • Windows OSやインストールされているソフトウェア関連の情報を含む。

  • HKLM\SYSTEM

    • C:\WINDOWS\system32\config\systemが相当する。バックアップファイルはsystem.LOG。
    • ハードディスクなどのボリュームを管理するための情報や、システム関連情報を含む。

  • HKLM\SYSTEM\CurrentContlolSet、ControlSet001-3

    • CurrentControlSetは現在利用されているハードウェアプロファイルで、サービス関連の設定その他が含まれる。
    • ControlSet001-3などは万が一OSが起動しなくなった場合のバックアップと現在の情報である。
    • ControlSet001-3の末尾の数字の割り当ては、HKLM\SYSTEM\Selectに記載されている。下図(XP Pro英語版)中のDefault(1)はデフォルトで利用され、Current(1)は現在利用されているコントロールセット、Failed(0)は起動に失敗したコントロールセットがあった場合に1などが記載され、LastKnownGood(2)は前回正常起動時のコントロールセットでバックアップ目的である。しかし時にはこの末尾の数字は入れ替わる場合もある。




HKEY_USERS(HKU)


 ユーザごとのWindowsやソフトウェアの設定に関する情報。ハイブファイルはユーザーのログイン時に読み込まれる。
 作成したユーザーアカウントのうち、ログオンしていないアカウントのユーザープロファイルは通常は表示されない。言い換えると、他のユーザーアカウントのレジストリは「通常は」レジストリエディタよりは閲覧も編集できない。

  • HKU\.DEFAULT

    • C:\WINDOWS\system32\config\defaultに相当。新しく作成したユーザーアカウントの雛形・テンプレとなる。
    • レジストリだけではなく「C:\Documents and Settings\Default User」中のファイルもまた新規に作成されたユーザーアカウントのためのテンプレートとなる点には注意してもらいたい。際めて稀にこれを汚染するマルウェアも存在する。

  • HKU\S-1-・・・・・

    • セキュリティ識別子の項目にて後述する。

  • HKU\S-1-・・・・・_Classes

    • HKU\以下の「Classes」が末尾についたSIDはクラス情報関連。



HKEY_CURRENT_USER(HKCU)


 HKEY_USERS(HKU)における、現在ログオン中のユーザーレジストリプロファイルと\.Defaultとの内容を統合したもの
 ログオン中ユーザーアカウントの、Windowsやソフトウェアの設定に関する情報。ユーザープロファイルに関係する。
 C:\Documents and Settings\username\ntuser.dat、及びC:\Documents and Settings\username\Local Settings\Application Data\Microsoft\Windows\UsrClass.datが相当する。バックアップファイルはそれぞれntuser.dat.LOGとUsrClass.dat.LOGである。

HKEY_CURRENT_CONFIG(HKCC)


 HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Currentの中身のエイリアス(コピー)
 現在のシステム・ハードウェア環境を反映する

セキュリティ識別子(SID:Security Identifiers)


Windowsとセキュリティ識別子(SID)


 Windows内部では、ドメイン名やワークグループ名とユーザーアカウント名は、SID(security identifier:セキュリティ識別子)にて管理される。
 SID(セキュリティ識別子)には2種類の表記法がある。How to convert the SDDL form of an SID to a SAM account name (Microsoft)にては「S-」で始まる文字列(similar to s-x-x-x-x)をSDDL形式(Security Descriptor Definition Language form)、「domain\username」をSAM アカウント名形式(Security Accounts Manager account name form.)と記載している。とりあえずこの場にて以降SIDとは、SDDL形式のものを指すとする。

 SAMアカウント名形式とSDDL形式の違いを実感したいかい?Windows2000/XP Professionalにて、USBメモリーキーをワークグループ構成でセットアップしたパソコンにてNTFSフォーマットし、アクセス権を設定してもらいたい。これを他のパソコンにてアクセス権の設定操作を行おうと試みれば、先ほどのパソコンにて表示されていたユーザーアカウント名が数字の羅列になっているのに気付くだろう。

 SIDは一意の数字であり、他のユーザーアカウントとは重複しない数字がユーザーごとに割り当られる。
ユーザーアカウント削除後に同じ名称のアカウントを作成したとしても、SIDは別の値が設定されるので、Windowsはこれを混同しないだろう。
 なおSIDを変更するツールも存在する。

 レジストリエディタよりHKEY_USERSを開けば、幾つかのセキュリティ識別子(SID)が表示されているだろう。Windows XPでの例を以下に示す。


  • HKEY_USERS\.DEFAULT

    • 新規に作成するユーザーアカウントのテンプレート

  • HKEY_USERS\S-1-5-18

    • Local System(オペレーティング システムにより使用されるサービス アカウント)

  • HKEY_USERS\S-1-5-19

    • NT Authority(ローカル サービス)

  • HKEY_USERS\S-1-5-20

    • NT Authority(ネットワーク サービス)

  • HKEY_USERS\S-1-5-21-a-a-a-500

    • Administratorアカウント

  • HKEY_USERS\S-1-5-21-a-a-a-aaaa

    • ユーザーが作成したアカウント。


 この場合、S-1-5-21-a-a-a-aaaaを除く5つはビルトインSID(Windows OSにより予め自動的に作成されるもの)である。どのようなビルトインSIDが作成されるのかは、セットアップした環境により異なるだろう。

マイクロソフトはセキュリティ識別子についてこのように説明している。

 Windows XP のインストール時には、統計的に一意の 96 ビット数値を含むコンピュータ SID が設定されます。コンピュータ SID は、そのコンピュータ上に作成されるユーザー アカウントとグループ アカウントの SID のプレフィックスになります。コンピュータ SID にアカウントの相対 ID (RID) が連結され、アカウントの一意の識別子が作成されます。
 以下に、4 つのローカル ユーザー アカウントの SID の例を示します。新しいアカウントを追加すると、末尾 4 桁の数字だけが増加することに注意してください。

  • ローカル コンピュータ上の HKEY_USERS

    • S-1-5-21-191058668-193157475-1542849698-500 Administrator
    • S-1-5-21-191058668-193157475-1542849698-1000 ユーザー 1
    • S-1-5-21-191058668-193157475-1542849698-1001 ユーザー 2
    • S-1-5-21-191058668-193157475-1542849698-1002 ユーザー 3


Windows XP インストールのディスク複製に関するマイクロソフトの方針(Microsoft)

 つまり1000、1001などがユーザーアカウントの相対 ID (RID)となる。新しいユーザーアカウントを作成したらば、それに対応する数字はどんどん増えていくだろう。
 (500はユーザーアカウントIDだが相対IDではないだろう)

 SID関連情報として詳細な情報を知りたいならば、これらを参照してもらいたい。
 セキュリティ識別子(Microsoft)
 Windows サーバー オペレーティング システムの既知のセキュリティ識別子(Microsoft)
 オブジェクトを識別するSIDとは?(@IT)
 Windows XP インストールのディスク複製に関するマイクロソフトの方針(Microsoft)

セキュリティ識別子(SID:Security Identifiers)とユーザーアカウントとの対応


 現在登録されているSIDのどれがどのユーザーアカウントに対応するのかを確かめるには、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileListを開き、この中に登録されているSIDを開き、ProfileImagePathよりDocument and Settings以下のユーザーアカウント名を取得すればよい。

関連記事


 ウイルス・スパイウェア感染とWindowsのレジストリ(Registry)