• ベストアンサー

VBAでeventlogを取得したい

EXCEL2003のマクロを使用して、eventlogの6005と6006を取得し、 それらに対応する時刻を出力させたいのですが可能でしょうか。 お分かりになる方 ご教示の程、宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.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 ソースの修正が必要になりますが、その辺は 大丈夫ですよね?

参考URL:
http://www.microsoft.com/japan/technet/scriptcenter/topics/help/wmi.mspx
capote
質問者

お礼

お礼が遅くなってしまい申し訳ありません。 6005と6006を別シートに分けた所、 問題無く出力できました。 今回の質問では大変お世話になりました。 自身のレベルアップも図れ、大変嬉しく思います。 分かり易いご回答、有難う御座いました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

#1 です。 Excelという範疇でしたから、イベントログについて間違えていました。 今、イベントヴューアで見てみましたが、今の私では良く分からないし、Excel VBAの直接の範疇ではないような気がしましたので、手を引きます。 イベントログ

参考URL:
http://www.microsoft.com/japan/technet/scriptcenter/scripts/logs/eventlog/default.mspx
capote
質問者

お礼

舌足らずな質問、大変失礼致しました。 今後気を付けさせて頂きます。 ご回答有難う御座いました。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。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
capote
質問者

お礼

ご回答有難う御座います。 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 ご回答頂いたコードをそのまま貼り付け実行してみたところ 上記コードの"⇒"部でエラーが発生してしまうのですが、 原因として何が考えられるでしょうか。 再度の質問で申し訳ありませんが、教えて頂けませんでしょうか。

capote
質問者

補足

度々申し訳ありません。 お礼のコメントに補足をさせて下さい。 コメント欄の"⇒"部でのエラーは数度目の実行で何故か無くなりました。 しかし、今度はfor~Nextでオートメーションエラーが発生してしまいます。 エラーは、実行(F5)で送るとi=120あたりで、ステップイン(F8)で送るとi=20あたりで発生します。 これらが発生する原因は何が考えられるでしょうか。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 質問の意味が分かりません。 >eventlogの6005と6006 なんに対するイベントログなのですか?ただ、何もなくてイベントが発生するというようなことはありません。何かに起動しているわけで、まったくの自動でイベントが発生しているわけではありません。それは、OnTimeや、ActiveX コントロールなどの、タイマーだと思います。ただ、そうですと、結構、難しいものがあると思います。つまり、元がマクロの場合は、二つは、同時に働かないからです。詳しい状況が分からないと、できません。

関連するQ&A