Autoit プログラミングWindows 10Windows 11便利機能

Autoit|ファイルのハッシュ値を確認するサンプルコード

スポンサーリンク
スポンサーリンク

今回は、ファイルのハッシュ値を取得する方法と Autoit で作成したサンプルコードを紹介します。

ハッシュ値とは、簡単に言うとファイルの身分証明書と言えます。

ただ、ハッシュ値は身分証明書よりも厳密であり、ファイルサイズ、時間、タイプ、作成者、マシンなどに基づいて計算され、少しでも変更があればハッシュ値が変わってきます。

ハッシュ値は多くの場合、ファイルの同一性の確認に使われます。

例えば当サイトでは筆者の自作ソフトを配布していますが、ソフトのハッシュ値とユーザー様がダウンロードしたソフトのハッシュ値が一致すれば正しいファイルとなりますが、もしもハッシュ値が一致しなければ次のように正しいファイルとは言えません。

  • ファイルのバージョンが違う
  • ファイルが壊れている
  • ファイルが改ざん(第三者がプログラムを書き換えること)されている

ハッシュ値の取得

ハッシュ値の取得には Windows のコマンド「certutil」を使用します。

取得できるハッシュアルゴリズムは

  • MD2
  • MD4
  • MD5
  • SHA1
  • SHA256
  • SHA384
  • SHA512

の7つです。

コマンドの書き方は次のようになります。

%systemroot%\System32\certutil.exe -hashfile %path% MD5

「%path%」の部分がファイル名、「MD5」の部分がアルゴリズムになります。

指定するファイル名にスペースが含まれている場合、ダブルクォーテーション(””)で囲む必要があります。

ファイル: “C:\Program Files\WinMyMenu\WinMyMenu.exe” アルゴリズム:MD5 を指定した例

%systemroot%\System32\certutil.exe -hashfile "C:\Program Files\WinMyMenu\WinMyMenu.exe" MD5

実際にコマンドプロンプトを開いて実行してみてください。

コマンドプロンプトの開き方(管理者として実行):

Windowsキー + R を押して「ファイル名を指定して実行」を開き「cmd」と入力し、Shift + Ctrl キーを押しながら Enter を押してください。

コマンドを入力します。

Enter を押すとハッシュ値が表示されます。

Windows のコマンド「certutil」を利用した Autoit のサンプルコード

サンプルコード

2022/12/21: コードの修正を行いました。

#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
#include-once

Opt("TrayIconHide", 0)

$Form1 = GUICreate("ハッシュ値の確認ツール", 448, 303, 206, 143, -1, BitOR($WS_EX_TOPMOST, $WS_EX_ACCEPTFILES))
GUISetBkColor(0xFFFFFF)
$Radio1 = GUICtrlCreateRadio("MD2", 40, 48, 113, 17)
$Radio2 = GUICtrlCreateRadio("MD4", 40, 80, 113, 17)
$Radio3 = GUICtrlCreateRadio("MD5", 40, 112, 113, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Radio4 = GUICtrlCreateRadio("SHA1", 176, 48, 113, 17)
$Radio5 = GUICtrlCreateRadio("SHA256", 176, 80, 113, 17)
$Radio6 = GUICtrlCreateRadio("SHA384", 176, 112, 113, 17)
$Radio7 = GUICtrlCreateRadio("SHA512", 312, 48, 113, 17)
GUICtrlCreateGroup("", 16, 24, 417, 121)
$Edit1 = GUICtrlCreateEdit("", 16, 160, 417, 77, $ES_AUTOVSCROLL)
GUICtrlSetState($Edit1, $GUI_DROPACCEPTED)
$Button1 = GUICtrlCreateButton("コピー", 328, 252, 105, 33)
$Button2 = GUICtrlCreateButton("リセット", 203, 252, 105, 33)
GUISetState(@SW_SHOW)

If IsAdmin() Then ; 管理者として実行するとドラッグ&ドロップができない問題を回避する
    _ChangeWindowMessageFilterEx($Form1, 0x233, 1) ; $WM_DROPFILES
    _ChangeWindowMessageFilterEx($Form1, $WM_COPYDATA, 1) ; redundant?
    _ChangeWindowMessageFilterEx($Form1, 0x0049, 1) ; $WM_COPYGLOBALDATA
EndIf

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            Copy();ハッシュ値をコピーします。
        Case $Button2
            GUICtrlSetData($Edit1, ""); エディットコントロールの文字を削除します。
        Case $GUI_EVENT_DROPPED
            GUICtrlSetData($Edit1, "")
            If Not StringInStr(FileGetAttrib(@GUI_DragFile), "D") Then; フォルダー以外のファイルのみ対応
                CheckRadio(@GUI_DragFile)
            EndIf
    EndSwitch
WEnd

Func CheckRadio($_DragFile)
    Local $txt
    For $i = 1 To 7
        If _IsChecked(Eval("Radio" & $i)) Then; ラジオボタンがチェックされていれば
            $iPID = Run(@ComSpec & ' /c %systemroot%\System32\certutil.exe -hashfile "' & _
                    $_DragFile & '" ' & GUICtrlRead(Eval("Radio" & $i), 1), "", @SW_HIDE, _
                    $STDOUT_CHILD)
            While 1
                $sOutput = StdoutRead($iPID)

                If @error Then ExitLoop
                $txt &= $sOutput
            WEnd

            $String = StringRegExp($txt, "(?m)^([^:]+)\r$", 1)
            If Not @error Then
                GUICtrlSetData($Edit1, GUICtrlRead(Eval("Radio" & $i), 1) & ' ハッシュ値:' & @CRLF & $String[0])
                ExitLoop
            EndIf
        EndIf
    Next
EndFunc   ;==>CheckRadio

Func Copy()
    If GUICtrlRead($Edit1) <> "" Then
        ClipPut(GUICtrlRead($Edit1))
        MsgBox(0, "コピー", "コピーしました", 1, $Form1)
    EndIf
EndFunc   ;==>Copy

Func _IsChecked($iControlID)
    Return BitAND(GUICtrlRead($iControlID), $GUI_CHECKED) = $GUI_CHECKED
EndFunc   ;==>_IsChecked

Func _ChangeWindowMessageFilterEx($hwnd, $iMsg, $iAction)
    Local $aCall = DllCall("user32.dll", "bool", "ChangeWindowMessageFilterEx", _
            "hwnd", $hwnd, _
            "dword", $iMsg, _
            "dword", $iAction, _
            "ptr", 0)
    If @error Or Not $aCall[0] Then Return SetError(1, 0, 0)
    Return 1
EndFunc   ;==>_ChangeWindowMessageFilterEx

ハッシュ値の確認ツールの使い方

取得したいハッシュアルゴリズムを選択し、ファイルをエディットコントロールにドラッグ&ドロップをするとハッシュ値が表示されます。

実際に実行してみた動画をご覧ください。

当サイトでは、Windows 10/11 関連の情報、問題解決法やカスタマイズ方法などを紹介しています。皆様にとって、少しでもお役に立てれば幸いです。

コメント(降順)

OSの不具合に関する質問の場合は、明確かつ迅速に解決するために、以下の情報を分かる範囲で質問に含めてください。

1. 使用しているOSのバージョン

  • 例:Windows 10 Home 22H2、Windows 11 Pro 21H2 など

2. 発生している具体的な症状

  • 具体的な症状をできるだけ詳しく説明してください。
  • エラーメッセージが表示される場合は、その内容を正確に記載してください。
  • いつ、どのような操作中に問題が発生したのかを明記してください。

3. 症状が出たのはいつからですか?

  • 症状が出始めた時期をできるだけ具体的に教えてください。

4. 症状が出る前に何か特別な操作をしましたか?

  • 以下のような操作を行った場合は、教えてください。
    • アプリのインストール
    • システムの設定を変更するツールを使用した
    • ファイルの削除
    • レジストリの編集
    • その他

5. 症状が出た後に試したことはありますか?

  • 問題解決のために試したことを分かる範囲でリストアップしてください。
  • インターネットで調べた解決策を試したかどうか、その結果も記載してください。

6. Windows Updateは定期的に行っていますか?

  • 最近インストールした更新プログラムを教えてください。
  • 例:KB5034441

7. セキュリティソフトをご利用されていますか?

  • セキュリティソフトの種類(名称)を教えてください。

8. PCの型番

  • PCの型番がわかれば教えてください。
  • わからない場合は、「デスクトップ」または「ノート」と記入してください。
タイトルとURLをコピーしました