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> の使い方が今一わからないので、今度時間がある時にトライしてみます。