LinuxでWindowsレジストリを編集する chntpwコマンド

Linux Windowsレジストリ Fedora, Ubuntu, Trinity Rescue Kit

前回の記事 「kvmでWindowsXPが起動できない ブルースクリーン」の対処などでWindowsレジストリをオフライン(Windowsシステムが稼働していない)で編集したい時があります。よくあるケースでは「Windowsの管理者パスワードをリセットしたい」があると思います。

「Windowsの管理者パスワードをリセットしたい」場合は、専用のツールなどがありますが、「オフラインでWindowsレジストリを編集・追加・削除したい」場合、Linuxコマンドchntpwがあります。chntpwでも「Windowsパスワードをリセット(削除)」することができます。というより多くの「Windowsパスワード・リセット」ツールはバックエンドでchntpwが動作しているようです。

chntpw コマンドを使うには

さて、このchntpwコマンド 以前はknoppixに存在していたのですが、最新版knoppix(ここではバージョン6系)にはインストールされてませんでした。そこでchntpwコマンドを使うには以下の2パターンがいいのかもしれません。

Trinity Rescue Kit ライブCDを使う
Trinity Rescue Kitは起動不能や障害となったシステムの修復や、重要なデータなどを救出することを目的とした、ライブCD/ライブUSBのLinuxディストリビューションです。
http://trinityhome.org/
ntfsのマウントやchntpwコマンドがデフォルトで利用できます。デフォルトの起動では日本語キーボードのキーマップではないので、loadkeys jp106 などとキーマップを調整してください。
FedoraやUbuntuなどのライブUSBを使う
FedoraやUbuntuにはchntpwパッケージがありますので、これをインストールすればchntpwコマンドがつかえます。Fedoraでは以下のようにインストールします。
#yum install chntpw

chntpw は、 現時点で Windows NT3.x 2000 XP Vista Windows7のユーザデータベースファイルの情報閲覧およびユーザパスワード変更やリセットができます。それにミニマムなレジストリエディタ機能があります。これはオフライン(Windowsが起動されていない)で実行できるもので、Windowsのレジストリ・エディタ(regedit)がつない時には非常に有効です。私は「オフライン Windowsレジストリ編集ツール」では、これ以外の存在をしりません。

Windowsパスワードの変更・リセットの話題は、他の文献がありますので、ここではレジストリ操作について取り上げます。

chntpw コマンド Windowsレジストの操作

なおここからの操作は、Windowsレジストリを操作しますので、レジストリの知識があることを前提としていますし、これによって「Windowsが起動しない」または「Windowsの不具合がでる」ことがあります。Windowsレジストリはあらゆるものに関与していることから、レジストリが損傷をきたすとPC機能が停止してしまいます。バックアップをとるなど十分注意し、自己責任でおこなってください。

以下からは Fedora16 chntpwパッケージ chntpw コマンド version 0.99.6 にて

chntpw の 起動オプションは以下のようになっています。

chntpw [OPTIONS]  [systemfile] [securityfile] [otherreghive] [...]
-h This message
-u Username to change, Administrator is default
-l list all users in SAM file
-i Interactive. List users (as -l) then ask for username to change
-e Registry editor. Now with full write support!
-d Enter buffer debugger instead (hex editor),
-v Be a little more verbose (for debuging)
-L For scripts, write names of changed files to /tmp/changed
-N No allocation mode. Only same length overwrites possible (very safe mode)
-E No expand mode, do not expand hive file (safe mode)

レジストリ編集モードで起動する
chntpw -e system

レジストリ エディタのコマンドは以下のようになっています。

Simple registry editor:
hive [<n>]             - list loaded hives or switch to hive numer n
cd <key>               - change current key
ls | dir [<key>]       - show subkeys & values,
cat | type <value>     - show key value
dpi <value>            - show decoded DigitalProductId value
hex <value>            - hexdump of value data
ck [<keyname>]         - Show keys class data, if it has any
nk <keyname>           - add key
dk <keyname>           - delete key (must be empty)
ed <value>             - Edit value
nv <type#> <valuename> - Add value
dv <valuename>         - Delete value
delallv                - Delete all values in current key
rdel <keyname>         - Recursively delete key & subkeys
ek <filename> <prefix> <keyname>  - export key to <filename> (Windows .reg file format)
debug                  - enter buffer hexeditor
st [<hexaddr>]         - debug function: show struct info
q                      - quit

キーの階層移動は cd <key> 、 階層内のキー一覧表示は ls または ls <key> 、 レジストリキーの値を表示するには キーに移動して cat <value> となります。終了は q で、 編集していた場合 「保存するかどうか」きいてきます。

実際にWindowsレジストリを操作・編集してみる

ここでは、実際に以下のレジストリを追加する実例をやってみます。前提としてレジストリ・ファイルのあるntfsをLinuxでマウントできていて、レジストリ・ファイルを開ける状態にしてください。

このレジストリ追加は、前回の記事「kvmでWindowsXPが起動できない ブルースクリーン」で記事した、WindowsXP起動でブルースクリーン「STOP 7B」でエラーから起動できない対処となります。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7010]
"ClassGUID"="{4D36E96A-E325-11CE-BFC1-08002BE10318}"
"Service"="intelide"

HKEY_LOCAL_MACHINE\SYSTEM は 、 WindowsXPでは Cドライブ WINDOWS\system32\config フォルダ内の system ファイルとなります。



// systemファイルを開いて起動
# chntpw -e system
chntpw version 0.99.6 110511 , (c) Petter N Hagen
Hive  name (from header): 
ROOT KEY at offset: 0x001020 * Subkey indexing type is: 686c 
File size 5242880 [500000] bytes, containing 1192 pages (+ 1 headerpage)
Used for data: 80588/4338168 blocks/bytes, unused: 2388/755976 blocks/bytes.

Simple registry editor. ? for help.

// カレント(今の場所)キーの一覧表示 lsコマンド
> ls
Node has 7 subkeys and 0 values
  key name
  <ControlSet001>
  <ControlSet003>
  <LastKnownGoodRecovery>
  <MountedDevices>
  <Select>
  <Setup>
  <WPA></code></pre>

// カレントの移動 cdコマンド
> cd ControlSet001

// 階層を2つを指定してカレントキーの移動
\ControlSet001> cd Control\CriticalDeviceDatabase

// lsコマンドだけでなく dirコマンドでも同じ
(...)\Control\CriticalDeviceDatabase> dir
Node has 60 subkeys and 0 values
  key name
  <*CPQA0D7>
  <*fsvga932>
  <*pnp0000>
/* 途中省略 */
  <pci#ven_8086&dev_2570>
  <pci#ven_8086&dev_7000>
  <primary_ide_channel>
  <PS2_KEYBOARD>
  <PS2_MOUSE>
  <root#dmio>
  <root#ftdisk>
  <root#mssmbios>
  <root#rdpdr>
  <root#rdp_kbd>
  <root#rdp_mou>
  <root#swenum>
  <root#update>
  <secondary_ide_channel>

// レジストリ キー( pci#ven_8086&dev_7010 )の追加
(...)\Control\CriticalDeviceDatabase> nk pci#ven_8086&dev_7010

// 追加されたか確認する
(...)\Control\CriticalDeviceDatabase> ls
Node has 61 subkeys and 0 values
  key name
  <*CPQA0D7>
  <*fsvga932>
  <*pnp0000>
/* 途中省略 */
  <pci#ven_8086&dev_2570>
  <pci#ven_8086&dev_7000>
  <pci#ven_8086&dev_7010>   // ---- 追加されている
  <primary_ide_channel>
  <PS2_KEYBOARD>
  <PS2_MOUSE>
  <root#dmio>
  <root#ftdisk>
  <root#mssmbios>
  <root#rdpdr>
  <root#rdp_kbd>
  <root#rdp_mou>
  <root#swenum>
  <root#update>
  <secondary_ide_channel>

// 作成したレジストリ キーにカレントを移動
(...)\Control\CriticalDeviceDatabase> cd pci#ven_8086&dev_7010

// この時点で値(バリュー)はない
(...)\pci#ven_8086&dev_7010> ls
Node has 0 subkeys and 0 values

// 値の追加でタイプ指定は、REG_SZなどとするのではなく、番号指定する
(...)\pci#ven_8086&dev_7010> nv REG_SZ ClassGUID
Command syntax is:

 nv <type> <valuename>

where <type> should be the HEX NUMBER from one of these registry value types:

  0 : REG_NONE
  1 : REG_SZ
  2 : REG_EXPAND_SZ
  3 : REG_BINARY
  4 : REG_DWORD
  5 : REG_DWORD_BIG_ENDIAN
  6 : REG_LINK
  7 : REG_MULTI_SZ
  8 : REG_RESOUCE_LIST
  9 : REG_FULL_RES_DESC
  a : REG_RES_REQ
  b : REG_QWORD

Example:
 nv 4 foobar
to make a new value named foobar of the type REG_DWORD

// 値のタイプ「REG_SZ」は番号1だから以下のようなコマンドで値を空で追加
(...)\pci#ven_8086&dev_7010> nv 1 ClassGUID

(...)\pci#ven_8086&dev_7010> nv 1 Service

// 値を編集する(値の新規追加)
(...)\pci#ven_8086&dev_7010> ed ClassGUID
EDIT: <ClassGUID> of type REG_SZ with length 0 [0x0]

Now enter new strings, one by one.
Enter nothing to keep old.
[ 0]: [NEW]
-> {4D36E96A-E325-11CE-BFC1-08002BE10318}   // ----- ここに値を記述し Enterキー
newkv->len: 78

(...)\pci#ven_8086&dev_7010> ed Service
EDIT: <Service> of type REG_SZ with length 0 [0x0]

Now enter new strings, one by one.
Enter nothing to keep old.
[ 0]: [NEW]
-> intelide   // ----- ここに値を記述し Enterキー
newkv->len: 18

// lsコマンドで値のリストを確認
(...)\pci#ven_8086&dev_7010> ls
Node has 0 subkeys and 2 values
  size     type            value name             [value if type DWORD]
    78  REG_SZ            <ClassGUID>
    18  REG_SZ            <Service>

// catコマンドで値のデータを確認
(...)\pci#ven_8086&dev_7010> cat ClassGUID
Value <ClassGUID> of type REG_SZ, data length 78 [0x4e]
{4D36E96A-E325-11CE-BFC1-08002BE10318}

(...)\pci#ven_8086&dev_7010> cat Service
Value <Service> of type REG_SZ, data length 18 [0x12]
intelide

// qコマンドで終了。保存して良いか確認があるので y を入力して終了
(...)\pci#ven_8086&dev_7010> q

Hives that have changed:
 #  Name
 0  <system>
Write hive files? (y/n) [n] : y
 0  <system> - OK

Windows レジストリ エディタのようにエクスポートやインポートする

chntpw コマンド レジストリ エディタ モード では、レジストリのエクスポートができます。

ek <filename> <prefix> <keyname>

また Fredora chntpw パッケージには、 reged コマンドが付随しています。どうやらこの reged コマンド には、エクスポート インポート機能があるようです。

試しにレジストリ追加したキーをエクスポートしてみると、正常に保存されていました。
reged -x system 'HKEY_LOCAL_MACHINE\SYSTEM'
'ControlSet001\Control\CriticalDeviceDatabase\pci#ven_8086&dev_7010'
/var/tmp/export.reg

インポートに関しては、<prefixstring> の使い方が今一わからないので、今度時間がある時にトライしてみます。

関連したページ

nexia access map
x