【入門編】【上級プロフェッショナル向け】「Digital Signature」付き図面のオープン制御:署名の有効性を検証し、改ざんされた図面の保存を拒否する – AutoCAD VBA解析バイブル

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

【上級プロフェッショナル向け】図面の「真実」を守る:デジタル署名付きDWGの完全制御術

こんにちは。AutoCADの深淵へようこそ。

ここまでマクロの記録や、単純な図形描画の自動化をマスターしてきたあなたなら、次は「業務の信頼性」という一段高いステージへ進む準備ができています。

今日扱うテーマは、単なる「自動化」ではありません。インフラ設計やプラント建設といった、一線のミスが社会的な影響を及ぼす現場で求められる「図面の整合性(Integrity)の保証」です。具体的には、デジタル署名が付与された図面を開く際、その署名が有効かどうかを検証し、もし改ざんや失効が見られた場合には「保存」という決定的なアクションを拒否する、高度な制御ロジックについて解説します。

「マクロを動かす」段階から、「システムを設計する」段階への脱皮。その準備はいいですか?

1. なぜ「デジタル署名」の制御が必要なのか?

通常、AutoCADで図面を保存するとき、私たちは何も考えずに `Save` ボタンを押します。しかし、セキュリティが極めて重要なプロジェクトでは、図面そのものが「契約書」と同等の重みを持ちます。

  • 改ざんの防止: 第三者が図面内の寸法や属性をこっそり書き換えていないか。
  • 真正性の証明: その図面は、確かに承認されたエンジニアによって作成されたものか。

デジタル署名が付与されたDWGファイルは、内容が1ビットでも書き換えられれば、その署名は「無効」になります。プロフェッショナルなVBA開発者は、「署名が無効な図面を、誤って上書き保存してしまうリスク」をプログラムによって根絶しなければなりません。

2. 思考の転換:マクロ記録から「コントローラー・パターン」へ

ここで、初級者と上級者の決定的な違いについて触れておきましょう。

初級者は「保存ボタンが押されたら何かする」という、「出来事(Event)に反応する」考え方をします。しかし、VBAの標準的なイベント制御だけでは、AutoCAD本体の強力な保存プロセスを完全に封じ込めるのは至難の業です。

上級者は、「コントローラー(制御者)を介してのみ操作を許す」という設計思想を持ちます。
つまり、ユーザーに直接 `Save` をさせず、必ず私たちが作った「検証付き保存関数」を通させる仕組みを作るのです。これが、オブジェクトのライフサイクルを掌握するということです。

3. 実装の核心:署名検証ロジックの設計図

直接的な署名解析は非常に複雑なため、ここでは「署名の状態を判定するロジック」を組み込んだ、堅牢な保存制御モジュールの設計例を示します。

実装のフローイメージ

1. Open時: ファイルの署名状態をチェックし、変数に保持する。
2. Save時: 保存を実行する直前に、現在の図面状態と署名の整合性を再チェック。
3. 判定:

  • `Valid`(有効) $\rightarrow$ 保存実行。
  • `Invalid/Tampered`(改ざん・無効) $\rightarrow$ 保存をブロックし、警告ログを出力。

実装コード例:SecureSave Module

以下のコードは、標準モジュールに記述して、業務アプリの基盤として使用するイメージです。

Option Explicit

' 図面の信頼状態を定義する列挙型
Public Enum SignatureStatus
    Status_Unknown = 0
    Status_Valid = 1      ' 署名有効
    Status_Invalid = 2    ' 署名無効(改ざんの疑い)
    Status_Missing = 3    ' 署名なし
End Enum

' 現在開いている図面の署名状態を保持するグローバル変数
' (本来はクラスモジュールで管理するのが理想的です)
Private CurrentDocStatus As SignatureStatus

''' <summary>
''' 図面を安全に開くためのラッパー関数
''' </summary>
Public Sub SecureOpen(ByVal filePath As String)
    Dim acadDoc As AcadDocument
    
    On Error GoTo ErrorHandler
    
    ' 1. ファイルを開く
    Set acadDoc = Documents.Open(filePath)
    
    ' 2. 署名の検証(※ここでは概念的なロジックを示します)
    ' 実際の運用では、Shell関数や外部DLL、または.NET APIを介して
    ' Windowsの証明書ストアを確認するロジックをここに組み込みます。
    CurrentDocStatus = CheckDigitalSignature(filePath)
    
    Select Case CurrentDocStatus
    Case Status_Invalid
        MsgBox "警告: この図面は署名が無効です!改ざんの可能性があります。" & vbCrLf & _
               "閲覧専用モードとして扱います。", vbCritical, "セキュリティ警告"
    Case Status_Missing
        MsgBox "通知: この図面にはデジタル署名が付与されていません。", vbInformation, "情報"
    Case Status_Valid
        MsgBox "図面は検証済みです。信頼できるデータです。", vbInformation, "確認完了"
    End Select
    
    Exit Sub

ErrorHandler:
    MsgBox "ファイルを開けませんでした: " & Err.Description, vbExclamation
End Sub

''' <summary>
''' 署名を検証して保存を行う、プロフェッショナル用保存関数
''' </summary>
Public Sub SecureSave()
    Dim doc As AcadDocument
    Set doc = ThisDrawing
    
    ' 1. 保存前に現在の署名状態を最終チェック
    ' (開いた後に図面が変更されている可能性があるため)
    If CurrentDocStatus = Status_Invalid Then
        MsgBox "【保存拒否】" & vbCrLf & _
               "署名が無効な図面を上書き保存することは、セキュリティポリシーにより禁止されています。", _
               vbCritical, "重大なエラー"
        Exit Sub
    End If
    
    ' 2. 保存実行
    On Error Resume Next
    doc.Save
    
    If Err.Number <> 0 Then
        MsgBox "保存中にエラーが発生しました: " & Err.Description, vbCritical
    Else
        MsgBox "図面を安全に保存しました。", vbInformation, "完了"
    End If
End Sub

''' <summary>
''' デジタル署名の整合性を判定する(シミュレーション関数)
''' </summary>
Private Function CheckDigitalSignature(ByVal path As String) As SignatureStatus
    ' --- 本来のプロフェッショナルな実装箇所 ---
    ' ここで外部のセキュリティツールや、Windows API、
    ' あるいは AutoCAD .NET API の DigitalSignature 機能を呼び出します。
    ' ---------------------------------------
    
    ' 今回はデモンストレーションのため、ファイル名に "CORRUPT" 
    ' という文字列が含まれていたら無効と判定するロジックにします。
    If InStr(path, "CORRUPT") > 0 Then
        CheckDigitalSignature = Status_Invalid
    ElseIf InStr(path, "UNSIGNED") > 0 Then
        CheckDigitalSignature = Status_Missing
    Else
        CheckDigitalSignature = Status_Valid
    End If
End Function

4. ここが落とし穴!陥りやすいエラーと回避策

このレベルのプログラミングを行う際、初心者が必ずと言っていいほど躓くポイントが3つあります。

① 「状態」の管理ミス(State Management)

上記のコードで、`CurrentDocStatus` をグローバル変数(またはクラスのプロパティ)として保持しています。もし、ユーザーが「図面を閉じて、別の図面を開いた」ときに、この変数をリセットし忘れると、「署名が無効な図面なのに、新しい図面が有効であると誤認される」という致命的なバグが発生します。

  • 対策: `Document_Close` イベントなどで、必ず状態を `Status_Unknown` に戻す設計を徹底してください。

② ファイルロックの競合

署名検証のために外部プロセス(ウイルス対策ソフトやデジタル署名検証ツール)を呼び出す際、AutoCADがファイルを開いているために「ファイルが使用中です」というエラーが出ることがあります。

  • 対策: 検証を行う際は、ファイルそのものを開くのではなく、ファイルの「メタデータ(属性情報)」のみを読み取る手法を選択してください。

③ 「変更」と「改ざん」の区別

署名付き図面を編集して保存しようとすると、当然署名は外れます。

  • 設計の極意: 「署名が外れたからダメ」なのか、「悪意のある改ざんか」なのか。業務ルールに基づき、「署名が外れた場合は、新しい署名を付与するための専用フロー(承認ワークフロー)へ誘導する」といった、エラーで終わらせない設計が求められます。

5. まとめ:次なるステップへ

今回の解説は、単なるコードの書き方ではなく、「いかにしてシステムの信頼性を担保するか」というアーキテクチャの話でした。

1. イベントに依存せず、自前の「コントローラー関数」を作る。
2. オブジェクトの状態(署名の有無)を厳格に管理する。
3. エラーを「拒絶」だけでなく「正しいフローへの誘導」として捉える。

これらを意識するだけで、あなたの書くVBAは、単なる「便利な道具」から、企業のインフラを守る「信頼できるシステム」へと進化します。

ここをクリアすれば、AutoCAD VBAの基本はバッチリですよ。自信を持って、より複雑で、より価値のある自動化に挑戦していってください。応援しています!

タイトルとURLをコピーしました