Udostępnij za pośrednictwem


Zadania usługi WMI: dzienniki zdarzeń

Zadania usługi WMI dla dzienników zdarzeń uzyskują dane zdarzeń z plików dziennika zdarzeń i wykonują operacje, takie jak tworzenie kopii zapasowych lub czyszczenie plików dziennika. Inne przykłady można znaleźć w witrynie TechNet ScriptCenter pod adresem https://www.microsoft.com/technet.

Przykłady skryptów pokazane w tym temacie uzyskują dane tylko z komputera lokalnego. Aby uzyskać więcej informacji o sposobie uzyskiwania danych z komputerów zdalnych za pomocą skryptu, zobacz Connecting to WMI on a Remote Computer.

Poniższa procedura opisuje sposób uruchamiania skryptu.

Aby uruchomić skryptu

  1. Skopiuj kod i zapisz go w pliku z rozszerzeniem vbs, takim jak nazwa pliku.vbs. Upewnij się, że edytor tekstów nie dodaje rozszerzenia .txt do pliku.
  2. Otwórz okno wiersza polecenia i przejdź do katalogu, w którym zapisano plik.
  3. Wpisz cscript nazwa pliku.vbs w wierszu polecenia.
  4. Jeśli nie możesz uzyskać dostępu do dziennika zdarzeń, sprawdź, czy korzystasz z wiersza polecenia z podwyższonym poziomem uprawnień. Niektóre dzienniki zdarzeń, takie jak dziennik zdarzeń zabezpieczeń, mogą być chronione przez kontrolę dostępu użytkowników (UAC).

Nuta

Domyślnie skrypt cscript wyświetla dane wyjściowe skryptu w oknie wiersza polecenia. Ponieważ skrypty usługi WMI mogą generować duże ilości danych wyjściowych, może być konieczne przekierowanie danych wyjściowych do pliku. Wpisz cscript filename.vbs > outfile.txt w wierszu polecenia, aby przekierować dane wyjściowe pliku pliku.vbs skryptu, aby outfile.txt.

W poniższej tabeli wymieniono przykłady skryptów, których można użyć do uzyskania różnych typów danych z komputera lokalnego.

Jak mogę... Klasy lub metody WMI
... pobrać informacje o dzienniku zdarzeń zabezpieczeń? Dołącz uprawnienia zabezpieczeń podczas nawiązywania połączenia z klasą Win32_NTEventlogFile. Aby uzyskać więcej informacji, zobacz wykonywanie operacji uprzywilejowanych przy użyciu języka VBScript.
VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate,(Security)}!\\" & _
        strComputer & "\root\cimv2")
Set colLogFiles = objWMIService.ExecQuery _
    ("Select * from Win32_NTEventLogFile " _
        & "Where LogFileName='Security'")
For Each objLogFile in colLogFiles
    Wscript.Echo objLogFile.NumberOfRecords
    Wscript.Echo "Maximum Size: " _
    &  objLogfile.MaxFileSize 
Next
PowerShell
$strComputer = "."
$colLogFiles = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $strComputer | Where-Object {$_.LogFileName -eq 'security'}
foreach ($objLogFile in $colLogFiles) 
{ 
    "Record Number: " + $objLogFile.NumberOfRecords
    "Maximum Size: " + $objLogFile.MaxFileSize
}
... czy utworzyć kopię zapasową dziennika zdarzeń?

Użyj klasy Win32_NTEventlogFile i metody BackupEventLog. Podczas nawiązywania połączenia z usługą WMI może być konieczne dołączenie uprawnień Backup. Aby uzyskać więcej informacji, zobacz wykonywanie operacji uprzywilejowanych przy użyciu języka VBScript.

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate,(Backup)}!\\" & strComputer & "\root\cimv2")
Set colLogFiles = objWMIService.ExecQuery ("Select * from Win32_NTEventLogFile " & "Where LogFileName='Application'")
For Each objLogfile in colLogFiles
    errBackupLog = objLogFile.BackupEventLog("c:\scripts\application.evt")
    WScript.Echo "File saved as c:\scripts\applications.evt"
Next

PowerShell
              
              $strComputer = "." $colLogFiles = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $strComputer | Where-Object {$_. LogFileName -eq "Application"} 

foreach ($objLogFile in $colLogFiles) { [void]$objLogFile.BackupEventlog("c:\scripts\applications.evt") "File saved as c:\scripts\applications.evt" }

... czy utworzyć kopię zapasową dziennika zdarzeń więcej niż raz?

Przed użyciem Win32_NTEventlogFile i metody BackupEventLog upewnij się, że plik kopii zapasowej ma unikatową nazwę. System operacyjny nie zezwala na zastępowanie istniejącego pliku kopii zapasowej; Musisz przenieść plik kopii zapasowej lub zmienić jego nazwę, aby można było ponownie uruchomić skrypt. Podczas nawiązywania połączenia z usługą WMI może być konieczne dołączenie uprawnień Backup. Aby uzyskać więcej informacji, zobacz wykonywanie operacji uprzywilejowanych przy użyciu języka VBScript.

VB
dtmThisDay = Day(Date)
dtmThisMonth = Month(Date)
dtmThisYear = Year(Date)
strBackupName = dtmThisYear & "_" & dtmThisMonth & "_" & dtmThisDay
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate,(Backup)}!\\" & strComputer & "\root\cimv2")
Set colLogFiles = objWMIService.ExecQuery ("Select * from Win32_NTEventLogFile " & "Where LogFileName='Application'")
For Each objLogfile in colLogFiles
    objLogFile.BackupEventLog("c:\scripts\" & strBackupName & "_application.evt")
    objLogFile.ClearEventLog()
    WScript.Echo "File saved: " & strBackupName & "_application.evt"
Next

PowerShell
              
              $CurDate = Get-Date $strBackupName = $curDate.Year.ToString() + "_" + $curDate.Month.ToString() + "_" + $CurDate.Day.ToString() 

$strComputer = "." $colLogFiles = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $strComputer | Where-Object {$_.LogFileName -eq 'Application'} foreach ($objLogFile in $colLogFiles) { $BackupFile = $objLogFile.BackupEventlog("c:\scripts" + $strBackupName + "_application.evt") "File saved: c:\scripts" + $strBackupName + "_application.evt" }

... określić liczbę rekordów w dzienniku zdarzeń?

Użyj klasy Win32_NTEventlogFile i sprawdź wartość właściwości NumberOfRecords.

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colLogFiles = objWMIService.ExecQuery ("Select * from Win32_NTEventLogFile " & "Where LogFileName='System'")
For Each objLogFile in colLogFiles
    Wscript.Echo objLogFile.NumberOfRecords
Next

PowerShell
              
              $strComputer = "." $colLogFiles = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $strComputer | Where-Object {$_. LogFileName -eq 'System'} 

foreach ($objLogFile in $colLogFiles) { $objLogFile.NumberOfRecords }

... czyścić dzienniki zdarzeń?

Użyj klasy Win32_NTEventlogFile i metody ClearEventLog.

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate,(Backup, Security)}!\\" & strComputer & "\root\cimv2")
Set colLogFiles = objWMIService.ExecQuery ("Select * from Win32_NTEventLogFile " & "Where LogFileName='Application'")
For Each objLogfile in colLogFiles
    objLogFile.ClearEventLog()
    WScript.Echo "Cleared application event log file"
Next

PowerShell
              
              $strComputer = "." $colLogFiles = Get-WmiObject -Class Win32_NTEventLogFile -ComputerName $strComputer | Where-Object {$_. LogFileName -eq 'System'} 

foreach ($objLogFile in $colLogFiles) { [void]$objLogFile.ClearEventlog() "Cleared application event log file" }

... czy odczytywać zdarzenia z dzienników zdarzeń?

Użyj klasy Win32_NTLogEvent.

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colLoggedEvents = objWMIService.ExecQuery _
    ("Select * from Win32_NTLogEvent " _
        & "Where Logfile = 'System'")
For Each objEvent in colLoggedEvents
    Wscript.Echo "Category: " & objEvent.Category & VBNewLine _
    & "Computer Name: " & objEvent.ComputerName & VBNewLine _
    & "Event Code: " & objEvent.EventCode & VBNewLine _
    & "Message: " & objEvent.Message & VBNewLine _
    & "Record Number: " & objEvent.RecordNumber & VBNewLine _
    & "Source Name: " & objEvent.SourceName & VBNewLine _
    & "Time Written: " & objEvent.TimeWritten & VBNewLine _
    & "Event Type: " & objEvent.Type & VBNewLine _
    & "User: " & objEvent.User
Next

PowerShell
              
              $strComputer = "." $colLogFiles = Get-WmiObject -Class Win32_NTLogEvent -ComputerName $strComputer | Where-Object {$_. LogFile -eq 'System'} 

foreach ($objEvent in $colLoggedEvents) { "Category: " + $objEvent.Category "Computer Name: " + $objEvent.ComputerName "Event Code: " + $objEvent.EventCode "Message: " + $objEvent.Message "Record Number: " + $objEvent.RecordNumber "Source Name: " + $objEvent.SourceName "Time Written: " + $objEvent.TimeWritten "Event Type: " + $objEvent.Type "User: " + $objEvent.Use }

zadania usługi WMI dla skryptów i aplikacji

przykłady aplikacji WMI C++

TechNet ScriptCenter