Windowsのレジストリについて調べる機会があったので、そのメモです。
1.64bit/32bitの相違
64bit Windows OSでは、一部のレジストリエントリについてのビューを提供しており、64bit アプリと 32bit アプリで見え方が異なる。ビューの切り替えは /reg:xx オプションで指定する。
なお、レジストリを操作する reg.exe コマンドについても、64bit 版と 32bit 版の両方がインストールされている。
C:\>reg query HKLM\Software\Example
エラー: 指定されたレジストリ キーまたは値が見つかりませんでした
C:\>reg query HKLM\Software\Example /reg:64
エラー: 指定されたレジストリ キーまたは値が見つかりませんでした
C:\>reg query HKLM\Software\Example /reg:32
HKEY_LOCAL_MACHINE\Software\Example\App1
C:\>c:\Windows\SysWow64\reg query HKLM\Software\Example
HKEY_LOCAL_MACHINE\Software\Example\App1
2.32bitアプリケーションにおけるリダイレクト
64bit Windows OS上で32bit アプリからアクセスされた場合、一部のレジストリエントリについてはリダイレクトされる。
アクセス先 | リダイレクト先 |
---|---|
HKLM\Software | HKLM\Software\Wow6432Node |
HKCR | HKCR\Wow6432Node |
また、REG_SZ|REG_EXPAND_SZ 型の値については、内容の自動的な置換が行われる場合もある。
書き込んだ値 | 自動置換後 |
---|---|
%ProgramFiles% | %ProgramFiles(x86)% |
%commonprogramfiles% | %commonprogramfiles(x86)% |
- ※ レジストリのリフレクション(本来の位置とリダイレクト先との自動同期)
- → Window 7 / 2008 R2 以降で廃止。
3.UAC環境におけるレジストリの仮想化
Vista/2008 以降で、UAC(User Access Control)配下において、レジストリへのアクセスが権限不足により失敗した場合の救済措置。32bitの会話型アプリケーションでのみ有効。
3.1.書き込み時
書き込みに失敗した場合、代替位置に書き込む。
書き込み希望位置 | 代替位置(迂回先) |
---|---|
HKLM\Software | HKUS(SID)_Classes\VirtualStore\MACHINE\Software |
ただし以下のエントリは仮想化対象外:
- HKLM\Software\Classes
- HKLM\Software\Microsoft\Windows
- HKLM\Software\Microsoft\Windows NT
3.2.読み込み時
以下の順に読み込む
1.迂回先エントリ
2.本来のエントリ(迂回先がなかった場合のみ)
3.3.仮想化の状態確認
C:\>reg flags HKLM\Software\Example query /reg:32
HKEY_LOCAL_MACHINE\Software\Example
REG_KEY_DONT_VIRTUALIZE: CLEAR ←ここで識別する
REG_KEY_DONT_SILENT_FAIL: CLEAR
REG_KEY_RECURSE_FLAG: CLEAR
- CLEAR: 仮想化されている
- SET: 仮想化されていない
4.レジストリ内容の表示
C:\>reg query HKLM\Software\Example\App1\System /reg:32 /s
HKEY_LOCAL_MACHINE\Software\Example\App1\System
Database REG_SZ
InstallDir REG_SZ C:\Example\App1\
LastUser REG_SZ
AppType REG_DWORD 0x0
UseClient REG_BINARY 00
TempPath REG_SZ C:\Example\App1\Temp
User REG_SZ sa
ProgPath REG_SZ C:\Example\App1\Bin
Server REG_SZ COMPUTERNAME\ExampleINSTANCE
ProductType REG_SZ 1
OEM REG_SZ アプリケーション名称
No REG_DWORD 0x0
LogPath REG_SZ C:\Example\App1\Data
Micr REG_DWORD 0x1
LoginMode REG_DWORD 0x2
DbPath REG_SZ C:\Example\App1\Data
5.レジストリのコピー
HKLM\Software\Example 配下を HKLM\Software\Example-32 に再帰的にコピー。
reg copy HKLM\Software\Example HKLM\Software\Example-32 /s /f /reg:32
6.レジストリの書き換え
接続先 SQL Server の値を書き換える例
set REG_KEY=HKLM\Software\Example\App1\System
set SERVER=xxx.yyy.ap-northeast-1.rds.amazonaws.com
reg delete %REG_KEY% /v Server /reg:32 /f
reg add %REG_KEY% /reg:32 /f /v Server /t REG_SZ /d %SERVER%
(参照)