読者です 読者をやめる 読者になる 読者になる

EmEditor (64-bit) 15.1.1 をインストールしたらシステムのPATH環境変数を綺麗さっぱり消された所からの顛末

※2015/5/19 訂正
当初、v15.1.2となっていましたが、どうやらv15.1.1で発生した問題であることが判明しました。
エムソフトの江村様からも丁寧な説明のメールを頂きましたこともここに併記させて頂きます。
今後、この記事を閲覧される方がいらっしゃる場合に混乱を招くと困りますので、記事のタイトルを修正させて頂きます。混乱を招く記事になっていたことをお詫びいたします。

EmEditor (64-bit) 15.1.2 15.1.1 (※2015/5/19 訂正) をインストールしたらシステムのPATH環境変数を綺麗さっぱり消されました。 robocopy とか実行しようとしたら、そんなコマンドないよなんて言われやがるので、なんで??っていう感じになって、システムの環境変数を見てみたら、

f:id:espresso3389:20150518231307p:plain

うわぁー、どう考えても、犯人は、 EmEditor じゃないですか・・・。

システムの復元を試みる

PATH環境変数を元に戻そうにも、そんなもの、内容覚えている訳ないじゃないですか。

さーて、落ち着け。こういうときは落ち着くのが一番大事。

どうするんだっけ。こういうとき。

あー、使ったことがないシステムの復元という機能がある。実行してみよう。

f:id:espresso3389:20150518231532p:plain

そうです。今日の朝ぐらいにノリでアップデートしたそいつです。多分、そいつが犯人です。
※2015/5/19 違います。2日前の早朝にノリでアップデートした方です。

一応、内容を確認。

f:id:espresso3389:20150518231609p:plain

はい。間違い有りません※2015/5/19 いいえ、間違っています。ただし、話の流れには影響しないのでそのまま進めます。そして、その内容で復元してくれるなら復元して欲しいです。
ということで、しばらく待っていたんですが、復元できませんね。

仕方が無いので、

f:id:espresso3389:20150518231903p:plain

ここから起動時に復元を試みましょう。

f:id:espresso3389:20150518224045j:plain

f:id:espresso3389:20150518224253j:plain

はーい。無理。

復元ポイントのデータから直接データを取得する

じゃぁ、アプローチを変えて、復元ポイントのデータから無理矢理PATHの値を取れないかな?

hidekiy blog: [windows] 復元ポイントに保存されたレジストリを閲覧する

少し昔のレジストリがどうなっていたかだけを知りたい場合には、C:\System Volume Information\_restore{GUID}\RPxxx\Snapshot の中に入っているレジストリハイブのスナップショットを使えばよいです。

はーい、C:\ にはそんなディレクトリはないか、あるいは、一般ユーザー(管理者)にもアクセス出来ないかどちらかの様です。この情報は Windows 8.1 では使えないみたいですね。

さて、

superuser.com

要は、レジストリハイブに対応する C:\Windows\System32\config\RegBack\SYSTEM っていうファイルの古いバージョンをレジストリエディタでロードしたら、中身が参照できるから、そこからPATHの古い値を取れるよっていう分かりやすい話。

なるほど。こっちは使えそうな話かな?って思っていると、

Special thanks to Microsoft for removing "Restore Previous Versions" from Windows 8.

えーーーーー。確かに、Windows 8にはこのUIはない。
ということでこの先の記事も一応見てみる。

Previous versions UI removed for local volumes (Windows)

simpliusさんのコメントに、

Use Shadow Explorer, \\localhost\c$ doesn't (always) work

とある。おー、そんなソフトがあるのか。

www.shadowexplorer.com


で、おー、確かに古いバージョンのレジストリハイブのファイル(C:\Windows\System32\config\RegBack\SYSTEM)をエクスポートできる。

f:id:espresso3389:20150518233132p:plain

※2015/5/19 よくみると、SYSTEMファイルのタイムスタンプが、2015/5/13 6:18になっています。従って、18日の5:00よりもかなり前のレジストリをバックアップしていることになります。

で、これをレジストリ エディターでロードします。ちょっとだけ分かりにくいので説明しておくと、最初に、HKEY_LOCAL_MACHINEとかを選択しないと、「ファイル - ハイブの読み込み」がグレーアウトしたままになります。

f:id:espresso3389:20150518233809p:plain

f:id:espresso3389:20150518233814p:plain

で、「ファイル - ハイブの読み込み」からさっきエクスポートした SYSTEM ファイルを読み込みます。で、名前を適当に決めないと行けないので、 SYSTEM.old とでもしておきます。

f:id:espresso3389:20150518233853p:plain

そうすると、次みたいな感じになるので、

f:id:espresso3389:20150518234008p:plain

ここから、

HKEY_LOCAL_MACHINE\SYSTEM.old\ControlSet001\Control\Session Manager\Environment

と辿っていくと、

f:id:espresso3389:20150518234221p:plain

やっと、古いPATHの値にたどり着きました。これをエクスポートするなり、コピペするなりすれば、元のPATHが復活できます。

僕の場合、この値は、

C:\Program Files\Cuminas\Document Express 8 Enterprise\;X:\\bin;C:\Program Files (x86)\Cuminas\Document Express DjVu Plug-in\;C:\Program Files (x86)\Python27\;C:\Program Files (x86)\Python27\Scripts;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Common Files\Sony Shared\FeliCaLibrary;C:\Program Files\Common Files\Sony Shared\FeliCaLibrary;C:\Program Files (x86)\Common Files\Sony Shared\FeliCaNFCLibrary;C:\Program Files\Common Files\Sony Shared\FeliCaNFCLibrary;C:\Program Files\TortoiseSVN\bin;C:\Program Files\EmEditor;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0\;C:\Program Files\Microsoft SQL Server\120\Tools\Binn\;C:\Program Files (x86)\nodejs\;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\ProgramData\chocolatey\bin;C:\tools\python2;C:\Program Files (x86)\Skype\Phone\;%USERPROFILE%\.dnx\bin;C:\Program Files\Microsoft DNX\Dnvm\

という値でした。1161文字。よく見ると、 %USERPROFILE% などがあるので、ExpandEnvironmentStrings で展開したりすると、1166文字。

いずれにしても、1024文字超えなので、プログラム中で、

WCHAR buf[1024];
GetEnvironmentVariableW(L"PATH", buf, 1024);

とかしてると、

GetEnvironmentVariable function

If lpBuffer is not large enough to hold the data, the return value is the buffer size, in characters, required to hold the string and its terminating null character and the contents of lpBuffer are undefined.

という部分にハマることにでもなるのでしょうか。他のマシンでの再現性がないことからも、PATHの長さが問題になった可能性は否定できないと思います。

問題は、そのクソインストーラを誰が書いたのか・・・という部分ですが。

後始末

さて、レジストリ エディターですが、ロードしたハイブは自動的にはアンロードされません。
先ほどの SYSTEM.old を選択して、「ファイル - ハイブのアンロード」をしておきましょう。

EmEditorのサイトに繫がった

さっきまで、EmEditorのウェブサイトが落ちていたのですが、今、改めて接続してみると、

そのものズバリの問題が見つかりました。
で、アップデート版があるみたいです:

v15.1.1 のインストールにてシステム環境変数「Path」の中身が消える - EmEditor (テキストエディタ)

だからといって、救われるわけではないんですけどね。
既にやっちまったユーザーに対しての修復方法なりの説明は必要ではないでしょうか。

※2015/05/19
フォーラムでは、既に直ったことになっていますが、上記スクリーンショットからエビデンスを一つ一つ見ていく感じでは、この問題は全然直ってないようです。
※2015/5/19 直っていました!
直近で2度のアップデートがあって、どちらが実際に影響しているのかの部分で混乱がありました。

f:id:espresso3389:20150519034715p:plain