Hatena::ブログ(Diary)

思い立ったら書く日記

 | 

2014-02-08

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

| 23:17 | PowerShellを使って、右クリックメニューでファイルのハッシュ値を算出するを含むブックマーク

Windows でファイルのハッシュ値を算出するとき、僕は「HashTab」をよく使っています。しかし、セキュリティポリシー等で使用するソフトウェアに制約があり、「HashTab」(や他のハッシュ値算出ツール)を(ポリシー上)使えないときがあります。そこで、Windows 7 から標準搭載された PowerShell を使い、ファイルの右クリックメニューからファイルのハッシュ値を算出する方法を調べました。

この日記では、Windows のレジストリを編集します。レジストリを誤って編集してしまうと、Windows の動作に問題が生じる恐れがあります(参考:Microsoft サイトにおける警告)。そのリスクを理解したうえで実践してください。

動作確認環境

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

WindowsPowershell*1
Windows 8Powershell 3.0
Windows 7 SP1Powershell 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')})); '' }"

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

f:id:kaito834:20140208162552p:image:w578:h164


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

f:id:kaito834:20140208163323p:image:w622:h136


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

この日記のワンライナーは、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

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; }"

f:id:kaito834:20140321214829p:image:w626:h140

まとめ

イケてる出力結果ではありませんが、ひとまず目標を達成できました。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?" を参照してください。

 |