In article <407FFBF1...@ht.sakura.ne.jp>
IIJIMA Hiromitsu <delm...@ht.sakura.ne.jp> writes:
> でも、MS Windows なら色々と方法がありますよ :-)
>
> 作業前後でレジストリがどう変化するのか調べて(変化を検出するツールもあり
> ますし、一番簡単な方法としては作業前後でレジストリ全域をテキストファイル
> に書き出して diff をとるだけでもいい)、該当部分の書き換えをする .reg フ
> ァイルを作るなり、動的に生成する必要があれば VBA や Perl でスクリプトを
> 書くなりすれば大抵はどうにかなります。
もう少し具体的に教えて下さい。レジストリをテキスト・ファイル
に書き出す方法と、.reg ファイルを作る方法です。
VBA とか perl とか WSH には近づきたくないのですが、人が作っ
たスクリプトを使うだけなら我慢できます。
> レジストリではなくファイルの場合は、filemon というツールでどのプロセスが
> どんなファイルにアクセスしているのかを全部検出できますので、それで解決。
filemon とか regmon とかも。
ただ最後に難しいのは、ファイルやレジストリわかった所で、整合
性をもって書き換えることです。単にファイルとレジストリの項目
がわかっても整合性がない状態で更新すると、おかしくなります。
> GUI でも、キーボードだけで完全に操作できるなら、ウィンドウにキーイベント
> を連続的に送り込むスクリプトを WSH あたりで書けば OK。
これで大業ですね。X Window のものが欲しいけど。WSH って、危
なそうで止めたいんだけど、自分の VM で止まっているのか確信が
持てません。
MacOSX なら、BSD なので、トレースは ktrace でいけます。
truss/strace が欲しいんだけど。
とりあえず Followup-To: fj.os.ms-windows.win2000 としておき
ます。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
> > でも、MS Windows なら色々と方法がありますよ :-)
> >
> > 作業前後でレジストリがどう変化するのか調べて(変化を検出するツールもあり
> > ますし、一番簡単な方法としては作業前後でレジストリ全域をテキストファイル
> > に書き出して diff をとるだけでもいい)、該当部分の書き換えをする .reg フ
> > ァイルを作るなり、動的に生成する必要があれば VBA や Perl でスクリプトを
> > 書くなりすれば大抵はどうにかなります。
>
> もう少し具体的に教えて下さい。レジストリをテキスト・ファイル
> に書き出す方法と、.reg ファイルを作る方法です。
はい。まず、レジストリの内容を一定の書式でテキストファイルに書きだした
ものが .reg ファイルです。中身はテキストファイルですので、スクリプトで
いじることができます。
次に、その使用方法ですが、バイナリ形式のレジストリデータベースから .reg
ファイルに書き出すには、GUI なら、レジストリエディタ(regedit)を起動し
て、メニューから「レジストリ(R)→レジストリファイルの書き出し(E)」です。
コマンドラインの場合は、たとえば
regedit /e filename HKEY_HOGE\path\to\the\key
のように指定します。
ただし、Windows XP のレジストリエディタ(たぶん 2000 も同じ)はデフォル
トで UCS-2 のファイルを吐きます。これをシフト JIS で書き出させるためには、
GUI なら Windows 9x/NT4 互換形式で書き出す、コマンドラインなら /t:ansi
オプションをつける、という配慮が必要です。ただ、シフト JIS の範囲に収ま
らない文字(たとえば簡体字やハングル)がレジストリ中に含まれている場合は
当然ながらシフト JIS は使えませんので、UCS-2 で吐き出してから適宜の方法で
UTF-8 に変換してスクリプトで処理する(もしくは UCS-2 を扱えるスクリプト
言語を使う)のが無難でしょう。直接 UTF-8 で書き出す方法も探したのですが、
見つかりませんでした。
.reg ファイルをレジストリデータベースに読み込むにはダブルクリックする
(もしくは start コマンドで起動する)だけですが、これだと確認のダイアログ
が出てしまうので、その部分でも手を抜きたければ(つまり、telnet 等で遠隔
操作して全自動で処理したければ)、
regedit /s filename
とすると確認なしで読み込みます。
☆
Perl なら、Win32::Registry で直接操作するという手もあります。
WSH でも直接操作できますが、現在のところ、
○複数行文字列形式(REG_MULTISZ)のエントリを取り扱えない
○書き込みの際には、バイト列型(REG_BINARY)のエントリには
4バイトしか書き込めない
(読み込みの場合は1つの配列に入る限り何バイトでもOK)
という、かなり厳しい制限があります。もちろん、WSH からレジストリエディタ
を起動してテンポラリファイルに書き出せば話は別です。
VBA は使っていないのでよく分かりません。
> ただ最後に難しいのは、ファイルやレジストリわかった所で、整合
> 性をもって書き換えることです。単にファイルとレジストリの項目
> がわかっても整合性がない状態で更新すると、おかしくなります。
御意。
========================================================================
飯嶋 浩光 / でるもんた・いいじま http://www.ht.sakura.ne.jp/~delmonta/
IIJIMA Hiromitsu, aka Delmonta mailto:delm...@ht.sakura.ne.jp
> WSH って、危なそうで止めたいんだけど、自分の VM で止まっているのか
> 確信が持てません。
「よほどのことがないと止められない/止めても抜け穴がある」というのが
答えになるのでは。
まず、WSH の JScript(JavaScript)エンジンは、IE と共用です。
(だから IE6 を入れるとWSH が強制的に 5.6 にアップグレードされる。)
従って、JScript エンジンを止めると、IE でのウェブページ閲覧に支障を
きたします。
つぎに、WSH でできることは本質的には「既にシステムにインストールされてい
る OCX コントロールを呼び出す」ことです。これは Excel+VBA で、あるいは
他のアプリのマクロでも簡単にできますので、そういうアプリを一切起動しない
・できないようにしないと無意味です。「OCX 自体を禁止する」というのは不可
能です。
逆に、システムのどこかで WSH に頼っている部分がないとも限らないので、
止めると問題が噴出する可能性があります。
ちなみに、WSH が動いているかどうかの確認は簡単です。
――cut here――
WScript.Echo("hello, world.\n");
――cut here――
という内容のファイルを拡張子 .js で保存して、
cscript filename.js
で呼び出してみてください。