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 |
右クリックメニューに「ファイルのハッシュ値を算出する」ワンライナーを追加する
レジストリエディタ「regedit」を起動して、次のようにレジストリを編集します。「SHA1ハッシュ算出」は任意の文字列で構いません。この文字列が右クリックメニュー名となります。
- HKEY_CLASSES_ROOT\*\shell 以下に 2 つのキーを追加する。
- HKEY_CLASSES_ROOT\*\shell\SHA1ハッシュ算出\command の (既定) を編集する。
- 「値のデータ」に下記のワンライナーを指定する。
- http://z.apps.atjp.jp/memo/powershell.html を参考にさせていただきました。
"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; }"
関連情報
- 右クリックメニューの追加について
- PowerShell について
更新履歴
更新日 | 更新内容 |
---|---|
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?" を参照してください。