「Excel – VBA」VBAプロジェクトのロック(保護)を解除されたらログを残す方法
VBAプロジェクトオブジェクトモデルへのアクセスを信頼するに が入っていることが前提です。Excelのファイルタブ – オプション(その他-オプション) – トラストセンター – トラストセンターの設定 – マクロの設定 を開くとウィンドウ内に当該チェック欄がございますので、チェックを入れてOKボタンを押してください
Excel でマクロファイルを作成後、勝手にいじられると困るのでVBAプロジェクトのロック(保護)をかけます。それでもルールを守らず強引にパスワード解析などをする社内クラッカーがいます
業務評価にログを添付して、解雇事由に使うこともございます。参考になれば幸いです
まずはVBAプロジェクトのロック(保護)の手順をおさらいします
「Alt + F11」 を押してVBAProjectウィンドウを開きます
「ツールタブ – VBAProjectのプロパティ」 の順に選択してプロジェクトプロパティを開きます
プロジェクトプロパティの「保護タブ」を選択して、「プロジェクトを表示用にロックする」へ
をいれます「パスワードと、パスワードの確認入力」へパスワード(同じもの)を入力してOKボタンをクリックします
これでブックを保存し閉じると、以降はブックを開きVBAProjectウィンドウを開こうとするとパスワードを求められます
今回は、この設定したロック(保護)を何かしらの方法で解除された場合にログを残す方法を説明いたします
まずはログファイルを用意してください。サンプルVBAコードと一致させるために「log.txt」を用意いただければと存じます
ログファイルを作成しましたら「Alt + F11」 を押してVBAProjectウィンドウを開きます
ThisWorkbookに以下をコピーしてください。右上のアイコンをクリックしてコピー
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim userName As String '変数userNameを文字列型で宣言
userName = Environ$("USERNAME") 'ユーザー名を取得
On Error Resume Next
'エラー非表示(ログ保存先がネットワーク上の時は、オフライン時にエラー表示されるため)
If ThisWorkbook.VBProject.Protection <> 1 Then
'プロジェクトが保護されていない場合、ログを残す
Open "ここにディレクトリを書いてください\log.txt" For Append As #1 '開くログファイルを指定
Print #1, userName & "がVBAプロジェクト保護を解除をしてからブックを閉じました。日時:" & Now 'ログファイルに書き込む文字列
Close #1 'ログファイルを閉じる
End If
End Sub
11行目の「ここにディレクトリを書いてください」の箇所を、実際のログファイル保存場所に書き換えてください
VBAコードを入力しましたらブックを保存してください
完了です
これでログファイルにログが書き込まれるようになりましたので、試しにVBAプロジェクトのロック(保護)パスワードを入力解除してVBAプロジェクトを開いてからブックを閉じてみてください(保存してもしなくても)
サンプルのVBAコードはネットワーク上にログファイルを置くこと想定しておりますが、PCローカルでもネットワーク上でもログファイルを置く場所はどちらでも動作します
インターネット経由で入手したOfficeファイルにはWEB符号が付きます(Mark of the Web (MOTW) )。これは、EMOTET等のマルウェア対策でMicrosoft社がセキュリティ強化のためOfficeソフトにアップデートをかけたものです。個々のユーザー環境(Officeの設定など)によりますが、インターネット経由で入手したOfficeファイルを開くと赤い警告メッセージがメッセージバーに表示されます。当該メッセージが表示されている時に、同時に当記事の「VBAプロジェクトロック(保護)解除ログ」マクロファイルを開き、閉じると、ロック(保護)解除していないのにログが残るバグを確認いたしました。誤判定をしてしまうような動作です。当情報は独自の検証結果です。海外フォーラムを調べられておりませんが、国内公開情報では見当たりませんでしたので、赤い警告メッセージが他ファイルのマクロ実行に及ぼす影響内容は不明です。赤い警告メッセージは下に表示したものです
英語:Microsoft has blocked macros from running because the source of this file untrusted.
VBAプロジェクトの保護状態を確認するために以下検証をいたしました
誤生成されるログに、VBProject.Protectionの値を合わせて書き込みするようVBAコードを修正したところ、”0″が入力されておりました。これはVBAプロジェクトのロック(保護)を解除、またはVBAプロジェクト(VBAコード)を表示している状態を表す値です
以下2ファイルを用意して当該事象をおさらい
- Book1.xlsm:「VBAプロジェクトロック(保護)解除ログ」マクロファイル
- Book2.xlsm:「赤い警告メッセージが表示される」マクロファイル
Book1とBook2を開き(開く順番は関係なし)、Book1を閉じるとログが誤生成されます。ただ、Book1とBook2を開き、VBAProjectウィンドウを開いてから(Alt + F11)、閉じるとログは残らずでした。Book1はBook2と当時に開いてもマクロは有効です。Book2はVBAProjectウィンドウを開くと、赤い警告メッセージ表示が消えますがマクロは無効のままです。VBAProjectウィンドウを開き、赤い警告メッセージ表示が消えた状態になるとバグ(誤動作によるログ生成)は発生しません
Debug.PrintでVBProject.Protectionの値を出力しイミディエイトウィンドウで確認 (必然的にVBAProjectウィンドウを開いている状態) すると、”1″ (保護されている状態) が表示されます。また、テーブルのA1セルにVBProject.Protectionの値を出力 (VBAProjectウィンドウを開かずに確認) しても、”1″ (保護されている状態) が表示されました
その他にも関係ないマクロを登録して実行してみたところ、赤い警告メッセージ表示が消えるマクロと、消えないマクロがございました。赤い警告メッセージ表示が消えると、他ファイルのマクロ動作でバグ(私どものケースだとVBProject.Protectionの判定)は発生せずでした。VBAに明るい方であれば働きかけを分類したマクロを数種類実行し、結果を分析すれば今回起きている事象を説明できるかもしれません
個人的には、VBAプロジェクトオブジェクトモデルへのアクセスを拒否している状態と予想しております
Officeのアップデートでもバグは様々発生します、イレギュラー時に誤動作されるのが困る、信頼性100%を求めたい場合には今回の方法はおすすめできません。否認防止ではなく、コードを見られても解読不可にしたい場合は難読化・暗号化の検討をおすすめします
いかがでしょうか。一助になれば幸いです