PowerShellを使って、右クリックメニューでファイルのハッシュ値を算出する

Windows でファイルのハッシュ値を算出するとき、僕は「HashTab」をよく使っています。しかし、セキュリティポリシー等で使用するソフトウェアに制約があり、「HashTab」(や他のハッシュ値算出ツール)を(ポリシー上)使えないときがあります。そこで、Windows 7 から標準搭載された PowerShell を使い、ファイルの右クリックメニューからファイルのハッシュ値を算出する方法を調べました。
この日記では、Windowsレジストリを編集します。レジストリを誤って編集してしまうと、Windows の動作に問題が生じる恐れがあります(参考:Microsoft サイトにおける警告)。そのリスクを理解したうえで実践してください。

動作確認環境

下表の Windows, PowerShell の組み合わせで、後述の 2 点を確認しました。

Windows Powershell*1
Windows 8 Powershell 3.0
Windows 7 SP1 Powershell 2.0
  • エラーが出ずに実行できること
  • 算出した SHA1 ハッシュ値が「HashTab」で算出したものと一致すること
    • "C:\Program Files\TrueCrypt\TrueCrypt.exe"

右クリックメニューに「ファイルのハッシュ値を算出する」ワンライナーを追加する

レジストリエディタ「regedit」を起動して、次のようにレジストリを編集します。「SHA1ハッシュ算出」は任意の文字列で構いません。この文字列が右クリックメニュー名となります。

  • HKEY_CLASSES_ROOT\*\shell 以下に 2 つのキーを追加する。
    • SHA1ハッシュ算出
    • SHA1ハッシュ算出\command
  • HKEY_CLASSES_ROOT\*\shell\SHA1ハッシュ算出\command の (既定) を編集する。
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoExit -command "& { $w=(Get-Host).UI.RawUI.WindowSize; $b=(Get-Host).UI.RawUI.BufferSize; $b.Width=120; $w.Width=120; $w.Height=10; (Get-Host).UI.RawUI.BufferSize=$b; (Get-Host).UI.RawUI.WindowSize=$w; $f=(gi """"%1""""); [string]::concat($f.FullName, ': '); [string]::concat(([security.cryptography.SHA1]::create().computehash($f.openread())|%%{$_.tostring('X2')})); '' }"


レジストリを編集すると、下図のようになります。


この右クリックメニューで、TrueCrypt.exe の SHA1 ハッシュ値を算出すると、下図のようになります。このハッシュ値を「HashTab」で算出したものと比較すると一致しました。

「ファイルのハッシュ値を算出する」ワンライナーの補足

この日記のワンライナーは、http://z.apps.atjp.jp/memo/powershell.htmlワンライナーに、PowerShell コンソールのウインドウサイズの変更処理を加えたものです。
TechNet の記事をもとに、PowerShell コンソールのウインドウサイズを変更します。当該記事では、WindowSize オブジェクトの Width, Height プロパティだけを変更していますが、この 2 つに加えて BufferSize オブジェクトの Width プロパティも変更します。僕の Windows 7 環境で BufferSize オブジェクトの Width プロパティを変更しなかった場合、次のエラーが出力されました。そこで、BufferSize オブジェクトの Width プロパティも変更しています。

"WindowSize" の設定中に例外が発生しました: "ウインドウの幅は画面バッファーの幅を上回ることができません。
パラメータ名: value.Width
実際の値は 120 です。"
(以下、略)

[2014年3月21日追記] Get-FileHash コマンドレットをワンライナーに使う

Powershell 4.0 には、ハッシュ値を算出する「Get-FileHash」コマンドレットが導入されました(このブログ記事で知りました)。

A new cmdlet, Get-FileHash, that returns a file hash in one of several formats for a specified file, has been added.

Archive Removal Jump Page | Microsoft Docs

Windows 8.1 には Powershell 4.0 が標準で搭載されているため*2、「Get-FileHash」コマンドレットを使って、下記のワンライナーも書けます。この右クリックメニューで、TrueCrypt.exe の SHA1 ハッシュ値を算出すると、下図のようになります。

"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoExit -command "& { $w=(Get-Host).UI.RawUI.WindowSize; $w.Width=120; $w.Height=10; (Get-Host).UI.RawUI.WindowSize=$w; Get-FileHash """"%1"""" -Algorithm SHA1 | Format-List; }"


まとめ

イケてる出力結果ではありませんが、ひとまず目標を達成できました。Windows 標準環境でもっとよいハッシュ値の算出方法があるよー、という方は教えていただけると嬉しいです。

更新履歴

更新日 更新内容
2014年2月8日 作成(ウェブ魚拓
2014年3月21日 「Get-FileHash」コマンドレットを使う方法を追記

*1:$PSVersionTable の PSVersion を確認しました。

*2:Windows 8.1 Frequently Asked Questions」の General - "Are there any new features in Windows PowerShell?" を参照してください。