Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What is going on with this article?
@hotta

Windowsレジストリ操作(リダイレクトと仮想化)

More than 3 years have passed since last update.

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%

(参照)
- 第6回 レジストリのリダイレクトと仮想化およびレジストリ操作ツール
- レジストリ・リダイレクタ(MSDN)

4
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
hotta
老害エンジニア

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
4
Help us understand the problem. What is going on with this article?