VB脚本帮助将事件日志写入excel

时间:2014-02-20 19:41:56

标签: vbscript

我有以下脚本从系统中获取事件日志并写入excel。它在“Windows 7”上正常运行,但在“Windows Server 2003”上,编写系统日志需要7到8分钟,并且会在几秒钟内写入应用程序日志。但是,系统日志中的错误数量非常少。

另一个问题是我在脚本中使用MyDate = DateAdd(“h”, - 8,Now())但它在12小时前提取日志。此时间计算无法正常运行。

我们非常感谢您的帮助。

这是脚本:

Option Explicit

Dim objFSO, objFolder, objFile, objWMI, objItem, objItem1, objItem2 ' Objects
Dim strComputer, strFileName, strFileOpen, strFolder, strPath, oExcel, oWB, oSheet, oSheet1, oSheet2  
Dim intEvent, intNumberID, intRecordNum, colLoggedEvents, colLoggedEvents2, colLoggedEvents3, MyDate, dtm, row,      row1, row2, Query, ServerTime
MyDate = DateAdd("h", -8, Now())

'---------------------------------------------------------

On Error Resume Next

Set oExcel=CreateObject("Excel.Application")
oExcel.Visible=true
Set oWB=oExcel.Workbooks.Open ("D:\EventLogs2.xls")
Set oSheet=oWB.Worksheets.Add ( , oWB.WorkSheets(oWB.WorkSheets.Count))
Set oSheet1=oWB.Worksheets.Add ( , oWB.WorkSheets(oWB.WorkSheets.Count))
Set oSheet2=oWB.Worksheets.Add ( , oWB.WorkSheets(oWB.WorkSheets.Count))
oSheet.Name="Application"
oSheet1.Name="Security"
oSheet2.Name="System"

strComputer = "." 
ServerTime = Now              

intRecordNum = 0
row = 0
row1 = 0
row2 = 0

' ----------------------------------------------------------
' WMI Core Section 
Set objWMI = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,(Security)}!\\" _ 
& strComputer & "\root\cimv2")

Set colLoggedEvents = objWMI.ExecQuery _ 
       ("SELECT * FROM Win32_NTLogEvent where Logfile = 'Application' and " _ 
        & "EventType = '1' and TimeWritten > '" & MyDate & "'")
Set colLoggedEvents2 = objWMI.ExecQuery _ 
       ("SELECT * FROM Win32_NTLogEvent where Logfile = 'Security' and " _         
        & "EventType = '1' and TimeWritten > '" & MyDate & "'")
Set colLoggedEvents3 = objWMI.ExecQuery _ 
       ("SELECT * FROM Win32_NTLogEvent where Logfile = 'System' and " _ 
        & "EventType = '1' and TimeWritten > '" & MyDate & "'")

' ----------------------------------------------------------
' Next section loops through ID properties

For Each objItem in colLoggedEvents                                    
If objItem.EventType=1 then                                                        
row = row+1
osheet.Cells(row,1).Value = ("Logfile: " & objItem.Logfile _ 
& " source " & objItem.SourceName) 
osheet.Cells(row,2).Value = ("Message: " & objItem.Message)
osheet.Cells(row,3).Value = ("TimeGenerated: " & WMIDateStringToDate(objItem.TimeGenerated))
osheet.Cells(row,4).Value = ServerTime

End If
Next


For Each objItem1 in colLoggedEvents2
If objItem1.EventType=1 then
row1 = row1+1
osheet1.Cells(row1,1).Value = ("Logfile: " & objItem1.Logfile _ 
& " source " & objItem1.SourceName) 
osheet1.Cells(row1,2).Value = ("Message: " & objItem1.Message)
osheet1.Cells(row1,3).Value = ("TimeGenerated: " & WMIDateStringToDate(objItem1.TimeGenerated))
osheet1.Cells(row1,4).Value = ServerTime

End If
Next                                                               


For Each objItem2 in colLoggedEvents3        
If objItem2.EventType=1 then
row2 = row2+1
osheet2.Cells(row2,1).Value = ("Logfile: " & objItem2.Logfile _ 
& " source " & objItem2.SourceName) 
osheet2.Cells(row2,2).Value = ("Message: " & objItem2.Message)
osheet2.Cells(row2,3).Value = ("TimeGenerated: " & WMIDateStringToDate(objItem2.TimeGenerated))
osheet2.Cells(row2,4).Value = ServerTime

intRecordNum = intRecordNum +1
End If
Next

Function WMIDateStringToDate(dtmDate) 
 WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & _ 
 Mid(dtmDate, 7, 2) & "/" & Left(dtmDate, 4) _ 
 & " " & Mid (dtmDate, 9, 2) & ":" & Mid(dtmDate, 11, 2) & ":" & Mid(dtmDate,13, 2)) 
End Function

oWB.save
oWB.Application.Quit
WScript.Quit

1 个答案:

答案 0 :(得分:0)

你不能只写一个CSV文件吗?

这样的事情:

Option Explicit

Dim objFSO, objFolder, objFile, objWMI, objItem, objItem1, objItem2 ' Objects
Dim strComputer, strFileName, strFileOpen, strFolder, strPath, oExcel, oWB, oSheet, oSheet1, oSheet2  
Dim intEvent, intNumberID, intRecordNum, colLoggedEvents, colLoggedEvents2, colLoggedEvents3, MyDate, dtm, row,      row1, row2, Query, ServerTime
MyDate = DateAdd("h", -8, Now())

'---------------------------------------------------------

On Error Resume Next

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.CreateTextFile("D:\EventLogs2.csv", True)

strComputer = "." 
ServerTime = Now              

intRecordNum = 0
row = 0
row1 = 0
row2 = 0

' ----------------------------------------------------------
' WMI Core Section 
Set objWMI = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,(Security)}!\\" _ 
& strComputer & "\root\cimv2")

Set colLoggedEvents = objWMI.ExecQuery _ 
       ("SELECT * FROM Win32_NTLogEvent where Logfile = 'Application' and " _ 
        & "EventType = '1' and TimeWritten > '" & MyDate & "'")
Set colLoggedEvents2 = objWMI.ExecQuery _ 
       ("SELECT * FROM Win32_NTLogEvent where Logfile = 'Security' and " _         
        & "EventType = '1' and TimeWritten > '" & MyDate & "'")
Set colLoggedEvents3 = objWMI.ExecQuery _ 
       ("SELECT * FROM Win32_NTLogEvent where Logfile = 'System' and " _ 
        & "EventType = '1' and TimeWritten > '" & MyDate & "'")

' ----------------------------------------------------------
' Next section loops through ID properties

For Each objItem in colLoggedEvents                                    
If objItem.EventType=1 then                                                        
    objFile.WriteLine("Logfile: " & objItem.Logfile & "," & " source " & objItem.SourceName & "," & _
        "Message: " & objItem.Message & "," & _
        "TimeGenerated: " & WMIDateStringToDate(objItem.TimeGenerated) & "," & _
        ServerTime)
End If
Next


For Each objItem1 in colLoggedEvents2
If objItem1.EventType=1 then
    objFile.WriteLine("Logfile: " & objItem1.Logfile & "," & " source " & objItem1.SourceName & "," & _
        "Message: " & objItem1.Message & "," & _
        "TimeGenerated: " & WMIDateStringToDate(objItem1.TimeGenerated) & "," & _
        ServerTime)
End If
Next                                                               


For Each objItem2 in colLoggedEvents3        
If objItem2.EventType=1 then
    objFile.WriteLine("Logfile: " & objItem2.Logfile & "," & " source " & objItem2.SourceName & "," & _
        "Message: " & objItem2.Message & "," & _
        "TimeGenerated: " & WMIDateStringToDate(objItem2.TimeGenerated) & "," & _
        ServerTime)
End If
Next

Function WMIDateStringToDate(dtmDate) 
 WMIDateStringToDate = CDate(Mid(dtmDate, 5, 2) & "/" & _ 
 Mid(dtmDate, 7, 2) & "/" & Left(dtmDate, 4) _ 
 & " " & Mid (dtmDate, 9, 2) & ":" & Mid(dtmDate, 11, 2) & ":" & Mid(dtmDate,13, 2)) 
End Function

objFile.Close
Set objFile = Nothing
Set objFSO = Nothing