- ベストアンサー
VBAでeventlogを取得したい
EXCEL2003のマクロを使用して、eventlogの6005と6006を取得し、 それらに対応する時刻を出力させたいのですが可能でしょうか。 お分かりになる方 ご教示の程、宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> これらが発生する原因は何が考えられるでしょうか。 OS 名と OS のバージョン、およびマクロ実行時のログインアカウントの権限は? Sql の WHERE 句が複雑すぎるのかもしれません。これを簡単に、つまり、2回に わけて 6005 と 6006 を取得するか、WHERE 句の AND 以降を全てカットし、 全てのイベントコードを取得してから、 Excel 側で加工するようにするか... で改善するかも。 ▼ 6005 取得の Sql(6006 は最後を " AND EventCode = 6006”に変更) Sql = "" Sql = Sql & "SELECT *" Sql = Sql & " FROM Win32_NTLogEvent" Sql = Sql & " WHERE Logfile = 'System'" _ & " AND EventCode = 6005" これにより Excel への出力部 VBA ソースの修正が必要になりますが、その辺は 大丈夫ですよね?
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
#1 です。 Excelという範疇でしたから、イベントログについて間違えていました。 今、イベントヴューアで見てみましたが、今の私では良く分からないし、Excel VBAの直接の範疇ではないような気がしましたので、手を引きます。 イベントログ
お礼
舌足らずな質問、大変失礼致しました。 今後気を付けさせて頂きます。 ご回答有難う御座いました。
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。KenKen_SP です。 こんな感じで WMI を使うか、ReadEventLog API を使えば VBA で可能です。 WMI の方が手軽ですがちょいと遅いです。WMI で得られる内容の詳細については 参考 URL で調べて下さい。 ' // イベントコード 6005, 6006 を取得します Sub SampleProc() Const wbemFlagReturnImmediately As Long = &H10 Const wbemFlagForwardOnly As Long = &H20 Dim Service As Object Dim EventList As Object Dim Obj As Object Dim sComputer As String Dim lFlags As Long Dim Sql As String Dim i As Long ' On Error Resume Next sComputer = "." lFlags = wbemFlagReturnImmediately Or wbemFlagForwardOnly Sql = "" Sql = Sql & "SELECT *" Sql = Sql & " FROM Win32_NTLogEvent" Sql = Sql & " WHERE Logfile = 'System'" _ & " AND EventCode = 6005 OR EventCode = 6006" Set Service = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate,(Security)}!\\" _ & sComputer & "\root\cimv2") Set EventList = Service.ExecQuery(Sql, iFlags:=lFlags) ' 出力 Cells.Clear Range("A1:D1").Value = Array("Code", "DateTime", "Computer", "Message") i = 2 For Each Obj In EventList Cells(i, "A").Value = Obj.EventCode Cells(i, "B").Value = Obj.TimeGenerated ' yyyymmddhhmmss.0000・・・形式です Cells(i, "C").Value = Obj.ComputerName Cells(i, "D").Value = Replace$(Obj.Message, vbCrLf, "") i = i + 1 Next Columns("A:D").AutoFit Set EventList = Nothing Set Service = Nothing End Sub
- 参考URL:
- http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/win32_ntlogevent.asp
お礼
ご回答有難う御座います。 WMIは今まで使用する機会がなかったので大変興味深いです。 色々と使えそうですので今後、勉強してみようと思います。 あと、一点質問させて下さい。 > ' 出力 > Cells.Clear > Range("A1:D1").Value = Array("Code", "DateTime", "Computer", "Message") > i = 2 ⇒> For Each Obj In EventList > Cells(i, "A").Value = Obj.EventCode ご回答頂いたコードをそのまま貼り付け実行してみたところ 上記コードの"⇒"部でエラーが発生してしまうのですが、 原因として何が考えられるでしょうか。 再度の質問で申し訳ありませんが、教えて頂けませんでしょうか。
補足
度々申し訳ありません。 お礼のコメントに補足をさせて下さい。 コメント欄の"⇒"部でのエラーは数度目の実行で何故か無くなりました。 しかし、今度はfor~Nextでオートメーションエラーが発生してしまいます。 エラーは、実行(F5)で送るとi=120あたりで、ステップイン(F8)で送るとi=20あたりで発生します。 これらが発生する原因は何が考えられるでしょうか。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 質問の意味が分かりません。 >eventlogの6005と6006 なんに対するイベントログなのですか?ただ、何もなくてイベントが発生するというようなことはありません。何かに起動しているわけで、まったくの自動でイベントが発生しているわけではありません。それは、OnTimeや、ActiveX コントロールなどの、タイマーだと思います。ただ、そうですと、結構、難しいものがあると思います。つまり、元がマクロの場合は、二つは、同時に働かないからです。詳しい状況が分からないと、できません。
お礼
お礼が遅くなってしまい申し訳ありません。 6005と6006を別シートに分けた所、 問題無く出力できました。 今回の質問では大変お世話になりました。 自身のレベルアップも図れ、大変嬉しく思います。 分かり易いご回答、有難う御座いました。