【テクニカル・上級編】【上級者】PowerPointの「プレゼンテーション保存前イベント(PresentationBeforeSave)」をフックし、特定のセキュリティ基準を満たさない場合の保存を強制キャンセルするセキュリティアドイン – PowerPoint VBA解析バイブル

スポンサーリンク

PowerPointを「鉄壁」に変える:PresentationBeforeSaveイベントを制するセキュリティアーキテクチャ

PowerPointの自動化において、多くのエンジニアが「保存」というイベントをユーザーの操作に委ねてしまっている。だが、企業レベルのデータガバナンスを追求するならば、保存動作は単なるIO処理ではなく、「機密情報の検閲ポイント」として再定義せねばならない。

本稿では、`Application.PresentationBeforeSave` イベントをフックし、スライド内の不適切なタグやメタデータを動的にスキャンして保存を物理的にブロックする、堅牢なアドインアーキテクチャを詳説する。

—

1. 概念の設計:アドインによる「検閲」のライフサイクル

VBAにおけるイベントフックは、本来「後処理」に偏りがちだ。しかし、`PresentationBeforeSave` は `Cancel` 引数をサポートしている。これを利用することで、保存プロセスを一時停止させ、バリデーション結果に応じて例外をスローさせるのが定石だ。

アーキテクチャの要点

  • イベントの独立性: `Class Module` を用いて、`AppEvents` をグローバル変数として保持。
  • メモリ管理: COMオブジェクトの参照を保持し続けることによるメモリリークを回避する設計。
  • パフォーマンス: スキャン対象はスライド内の `Shapes` 全体ではなく、`CustomDocumentProperties` および `Tags` を優先的にインデックスし、計算量を最適化する。

—

2. 実装:PresentationBeforeSave のフック

まず、`Class Module`(名前: `clsPPTApp`)を定義し、アプリケーションイベントを監視する。

‘ Class Module: clsPPTApp
Public WithEvents App As Application

Private Sub App_PresentationBeforeSave(ByVal Pres As Presentation, Cancel As Boolean)
‘ 1. セキュリティスキャンの実行
If Not IsComplianceSatisfied(Pres) Then
‘ 2. 保存の強制キャンセル
Cancel = True
MsgBox “セキュリティ違反が検出されました。保存は許可されません。”, vbCritical, “Governance Alert”
End If
End Sub

Private Function IsComplianceSatisfied(Pres As Presentation) As Boolean
‘ ここに社外秘タグ等の判定ロジックを実装
‘ パフォーマンス向上のため、Shapesのループは最小限に
Dim tagVal As String
tagVal = Pres.Tags(“Confidentiality”)

If tagVal = “High” Then
IsComplianceSatisfied = False ‘ 基準未達
Else
IsComplianceSatisfied = True
End If
End Function

【極限の知見】オブジェクトの解放と安定性

VBAで最も致命的なのは、イベント監視用オブジェクトが予期せず破棄されることだ。これを防ぐために、標準モジュールでグローバルにインスタンスを保持し、`Auto_Open` で適切に割り当てる必要がある。

‘ Standard Module: modInitializer
Dim AppHandler As clsPPTApp

Public Sub Auto_Open()
Set AppHandler = New clsPPTApp
Set AppHandler.App = Application
End Sub

—

3. Windows APIによる「強制」の補強

VBA標準の `MsgBox` だけでは、ユーザーにタスク切り替えを許してしまう。より強固な制御が必要な場合、`User32.dll` の `MessageBoxTimeout` を活用する。これにより、警告画面を一定時間で強制クローズし、ログ出力へ誘導するフローを構築可能だ。

‘ 標準モジュール:API定義
Private Declare PtrSafe Function MessageBoxTimeout Lib “user32” Alias “MessageBoxTimeoutA” ( _
ByVal hwnd As LongPtr, ByVal lpText As String, ByVal lpCaption As String, _
ByVal uType As Long, ByVal wLanguageID As Long, ByVal dwMilliseconds As Long) As Long

‘ 警告を5秒で強制的に閉じる実装
Sub ShowSecureAlert()
MessageBoxTimeout 0, “機密情報が含まれています。保存を遮断しました。”, “Security Policy”, 16, 0, 5000
End Sub

—

4. シニアエンジニアへの提言:実装上の罠

メモリリークを回避せよ

PowerPointのアドイン(.ppam)は、プロセス終了までメモリに常駐する。`Set AppHandler = Nothing` を忘れたり、循環参照を生成するコードを記述すると、PowerPointのシャットダウンが遅延し、最終的に「COM例外」を招く。必ず各オブジェクトはローカルスコープで処理し、保持する必要があるものだけをクラスモジュールで管理すること。

レガシー環境との共存

もし社内に複数のアドインが乱立している場合、`Application` イベントの奪い合いが発生する可能性がある。その場合は、`AppEvents` をラップし、実行ログを `Event Viewer` や `Event Log API` に書き出す中間層を設けるのが、真のプロフェッショナルの手法だ。

—

まとめ:防御こそが最大の自動化

「自動化」とは単なる効率化ではない。「システムが人のミスを物理的に防ぐ」ことこそが、自動化の究極形である。`PresentationBeforeSave` をフックすることで、機密漏洩という人災を、コードの力で未然に封じ込めることができる。

君の構築するアドインが、単なる便利ツールを超え、組織の「デジタル・ガードレール」となることを期待している。アーキテクチャの細部にこそ、エンジニアの魂は宿る。迷わず実装に没頭せよ。

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