保存されたデータは1024文字に切り捨てられました。(復旧済)


環境

Windows10

やらかしました

慢心でした。
Windows、慣れたつもりでいたのです。
ネットで得た中途半端な理解でコマンドを実行してはなりません、よね。
救済も用意していますので、
そのコマンドプロンプトを閉じずに読んでください。

何をやらかしたか

環境変数、いちいち"システムの詳細"をコントロールパネルから開いて設定するのすごくめんどくさい。
なのでコマンド憶えてちゃちゃっとコマンドプロンプトから設定しちゃおう、そう思いました。

setx PATH "%PATH%;$環境変数に設定したいパス"

見つけました。多くの場所で、こういうコマンドが紹介されています。
信頼してよく記事を読んでいるサイトでも紹介されていました。
寝不足のせいもありますが、油断しました。

これ絶対に実行してはなりません

でないと、こうなります。

C:\WINDOWS\system32>setx Path "%PATH%;$環境変数に設定したいパス"

警告: 保存されたデータは 1024 文字に切り捨てられました。

成功: 指定した値は保存されました。

C:\WINDOWS\system32>

成功してないですよね。大失敗ですよね。
警告するくらいならなんでいったん止まってくれないんですか。

「システムの詳細設定」から恐る恐る確認したところ、バラバラ殺人の現場。

被害者はほかにもいます。これシリアルキラーですよね。まだまだ被害出そうです。
http://www.codalabo.com/code/archives/31
また、某質問サイトにてこのコマンドを回答している方がいて、真に受けた質問者の方がそれを実行していたりしていました。
質問者の方の最後の一言は、例のエラーメッセージが出たという報告でした。
教えて君はあれですが、回答する側もどうなんでしょうね。

、、環境変数たくさん(1024文字以上)登録していて、めんどくさがりな人、たくさんいると思います。(多くの人はこんなトラップに引っかからないとも思いますが)

なので、投稿することにしました。恥ずかしい失敗なのであまり気が進みませんが。
被害拡大を防ぐ+被害回復支援のためです。備忘録でもあります。

それでどうしたか

レジストリに環境変数の実体が存在しています。
今回はユーザー環境変数の設定だったので、
"コンピューター\HKEY_CURRENT_USER\Environment"にあるPathというキーの値がその実体です。

普段からレジストリのバックアップを取ったり、システムの復元ポイントを作っているなら、
こうしたデータをバックアップから持ってきて回復することができます。
手間はそんなにかからないのではないでしょうか。

そして、私は、レジストリのバックアップなんて、半年前に取ったキリで、復元ポイントも、パフォーマンスのために作っていませんでした。

どうやって回復したか

現場の保全のために閉じずにいたコマンドプロンプトが役に立ちました。
結論申し上げますと、例の殺人コマンドを実行したプロンプトで

echo %PATH%

これを実行してください。
可哀そうなPathさんの在りし日の姿、思い出せましたでしょうか。泣けますね。
出力されたパスを一個ずつ、丁寧に「システムの詳細設定」から設定してあげてください。
今度こそ手放してはなりません。
コマンドプロンプトの出力も一応メモ帳などにバックアップしてから、設定したほうが良いでしょう。
ちなみに

echo %PATH:;= @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ %

とか打つと多少はコピペしやすくなったりします。

これで回復できました。
これの仕組みはそんなに難しいものではありません。コマンドプロンプトのインスタンスとかの話になります。
どこで読んだか忘れましたが、ググれば目につくネットメディアの記事に仕組みの解説あったきがします。

(また、このあと別の新たな問題が発生したので、その時のこと、解決に至るまでのこと等、後日投稿しようかなと思っています。この新たな問題については多くの方が言及してるので必要ない気もしますが。
キーワードは「2048文字」です。)

これからはレジストリとか大事な部分のバックアップを意識して、バッチファイル走らせます。

コマンドプロンプトを閉じてしまった方へ

私には以上の方法で精いっぱいです。
以上の方法はご飯食べてリラックスした時の思い付きでした。

ここからさきは、私がそれを思いつくまでに色々考えたりしたことです。
読むことをあまり推奨できません。しかし、ヒントになるかもしれません。

私の場合、解決の候補や周辺知識となるキーワードにたどり着くまでに時間がかかったりすること多いです。
なので、そういった私のような方々のために。

そもそもこの分野の知識が無いので間違った言葉を使ったり勘違いも沢山あります。
真に受けないという前提で。では書きます。

レジストリの復元

最初は、レジストリのバックアップをとっていないことを何度も確認しました。

最後のバックアップ以降、色々遊んでいました。
環境変数にはたくさんのパスが登録され、それなりに便利になっていて(散らかっていて)、諦めきれませんでした。

レジストリの実体があればファイル復元ソフトとかで何とかなるかもしれないと思いました。
しかし、少し調べてみると、
C:\Windows\System32\configに存在したハイブファイル(レジストリの実体?)が
Windows10のとあるバージョンへのアップデート以降は使われておらず、
バックアップも取られていないとのことでした。

それでも、HDDのどこかに残骸が残っている可能性はないか、考えました。
しかし、復元ソフトで確実に見つけられる保証はありません。
むしろ復元ソフトが激しく動くせいでデータ消えることもあるんじゃないかとも思いました。

環境変数のコマンドはデータを上書きをしたはずです。
しかし、ドライバのメモリマッピングの方法次第では
物理的には上書きされていない可能性を思いつきました。
場合によってはカーネルモードでなくともそれにアクセスできるのではないか、とも思いました。
マッピングの仕組み次第で、
それを利用してHDDのお目当てのアドレスへの参照を手に入れられるのではないかと。

ネットからデバイスドライバやらHALやらの情報にたどり着きました。
あと、MFTとか、関係しそうな技術も見つけました。
持っていたヘネパタ本とかインサイドWidowsなど引き出して読みました。
Linuxのカーネルやデバイスドライバのことも調べてみようかと思っていました。
あと、HDDメーカの資料とか、復元ソフト作っている方々の記事とか。

そうして
低レイヤの知識に触れている最中、疲れてご飯を食べてる最中に
前述したコマンドプロンプトのインスタンスを利用することを思いついたのです。

以上これだけです、私が調べたことは。

最後に

ちょっとトラウマになりました。

これから先、環境変数いじるときは
https://qiita.com/jeyei/items/2c385e4e0488a5fa2591#4
にある「環境変数の設定ダイアログを開く優良手順」つかいます。これは参考になると思います。