もりゃきに後は無い

エクスプローラーからコマンドプロンプト@Windows10 Creators Update

エクスプローラーのハック、というのは少し大げさだが、アイコンや(右クリックで開く)コンテキストメニュー、ファイル関連付けなどはレジストリに登録されている。

レジストリで制御するエクスプローラー

クリーナーソフトなどで使わないメニューを削除するのは、結局はレジストリのバックアップと編集、復元をしているだけだ。

インストーラー作成は、どこにファイルを置き、どうレジストリを書き換えるかを指示しているだけ、というのはさすがに古すぎる常識を基準にしていて嘘になるだろうが。

トリッキーな「Shift+右クリック」

エクスプローラーのアイテム(ドライブでもフォルダでもファイルでも、あるいは背景)に対して、大抵はただの右クリックでメニューが表示される。しかし「コマンドプロンプトを開く」項目を出すには、シフトキーを押しながら 右クリックという操作が必要になる。パワーユーザー以外には目に触れさせる必要がないという配慮だろう。

しかしWindows10 Creators Updateからは「PowerShellウィンドウをここに開く」に置き換わっている(どうでもいいが、日本語訳としてちょっと怪しい)

この違いに興味に興味を持った。

レジストリエディタで右クリック操作を覗く

PowerShellを開く設定は HKEY_CLASSES_ROOT\Directory\Background\shell\Powershell\command に格納されている。 ここに cmd の姿が見えるではないか。違いを見てみよう。

  • HKEY_CLASSES_ROOT\Directory\Background\shell\cmd には HideBasedOnVelocityId
  • HKEY_CLASSES_ROOT\Directory\Background\shell\Powershell には ShowBasedOnVelocityId

が設定されている、この違いだ。変なIDに意味不明のDWORD値、これが表示非表示を切り替えるフラグになっているのだろう。

名前から推測するに、文字列 Extended で右クリック時にコンテキストメニュー表示、 NoWorkingDirectory で有効なディレクトリ以外はコンテキストメニュー非表示といったところか。(未検証です)

しかし、ここで慌ててHKEY_CLASSES_ROOT\Directory\Background\shell\cmd自体を編集しようとしても権限を持っていないというエラーが出る。

それもそうだ。こんな危ないものをホイホイ書き換えられるなら、ここがそのまま脆弱性として攻撃対象になるところじゃないか、危ない危ない。

HKCRからHKLMへ

実のところ、ファイルの関連付けは従来HKCR(HKEY_CLASSES_ROOT)内を編集するしかなかった。しかし時代が進み、いつからかHKLM(HKEY_LOCAL_MACHINE)やHKCU(HKEY_CURRENT_USER)に移動したりと変化を続けている。 同様のことが起こっている可能性はある。特徴的な文字列 HideBasedOnVelocityId でレジストリ検索してみよう。

HKEY_CLASSES_ROOT\Directory\Background\shell\cmd
HKEY_CLASSES_ROOT\Directory\shell\cmd
HKEY_CLASSES_ROOT\Drive\shell\cmd
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\background\shell\cmd
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmd
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmd

これを書いている時点(バージョン1703、ビルド15063.296)では以上6件が見つかった。同じ構造をしているので、どちらか3件の場所に追加すれば問題ないだろう。

上から「ディレクトリ内でなにも選択していないとき」「ディレクトリ選択時」「ドライブ選択時」となる。

以下、危険かもしれない、右クリック登録

結論から言うと、以下のコードをregファイル保存、実行してしまえば 右クリックで「コマンドプロンプトを開く」 は追加できてしまう。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\background\shell\cmdforce]
@="@shell32.dll,-8506"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\background\shell\cmdforce\command]
@="cmd.exe /s /k pushd \"%V\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmdforce]
@="@shell32.dll,-8506"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmdforce\command]
@="cmd.exe /s /k pushd \"%V\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmdforce]
@="@shell32.dll,-8506"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmdforce\command]
@="cmd.exe /s /k pushd \"%V\""

警告が出るので、その意味をも理解できなければ手をつけない方がいい。

Shift+右クリック版

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\background\shell\cmdforce]
@="@shell32.dll,-8506"
"Extended"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\background\shell\cmdforce\command]
@="cmd.exe /s /k pushd \"%V\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmdforce]
@="@shell32.dll,-8506"
"Extended"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmdforce\command]
@="cmd.exe /s /k pushd \"%V\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmdforce]
@="@shell32.dll,-8506"
"Extended"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmdforce\command]
@="cmd.exe /s /k pushd \"%V\""

やっぱり嫌だと思った時のために

念のため、登録したものを削除するのは以下のコードをregファイルに保存以下略。

Windows Registry Editor Version 5.00

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\background\shell\cmdforce]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmdforce\command]

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmdforce\command]

こういうのって、ファイルをGithubにでも載せた方がいいのかな?内容が内容だけに、せめて意味を理解できる人以外は使えない最低限の配慮、のつもりだけど。

Microsoftさんも、コマンドプロンプトを排除しようとするのはいいけど、選択の余地を残したほうがいいような?

コントロールパネルをかなり強引に排除しようとして、それなりに嫌がられてるし。

2017/07/11遅くなったけど追記

設定の「個人用設定」-「タスクバー」からコマンドプロンプトとPowerShellを(排他的に)切り替えられるようになってますね。こういう、思ってる事を割とすんなり受け入れる姿勢は好き。