Jak wyczyścić dzienniki zdarzeń systemu Windows za pomocą wiersza polecenia?

14

Zwykle mogę otworzyć konsolę Zarządzanie komputerem, przejść do przystawki Podgląd zdarzeń, otworzyć folder Dzienniki systemu Windows, kliknąć Application/Security/Setup/Systempodfolder prawym przyciskiem myszy , wybrać Wyczyść dziennik i potwierdzić, naciskając przycisk Clearlub Save and Clear.

Mając wystarczającą liczbę uprawnień, jak mogę osiągnąć ten sam efekt za pomocą wiersza polecenia, nie zgłaszając żadnych żądań potwierdzenia?

Ivan
źródło

Odpowiedzi:

13

PowerShell.

PS C:\>Clear-Eventlog -Log Application, System

Domyślnie nie wyświetla się monit, ale możesz podać przełącznik -Potwierdź, jeśli chcesz otrzymać monit.

Edytować:

Get-WinEvent -ListLog Application,Setup,Security -Force | % { Wevtutil.exe cl $_.Logname }

Zgodnie z komentarzami powinny uzyskać zarówno dzienniki operacyjne, jak i administracyjne.

Ryan Ries
źródło
Dziękuję, powershell -Command "Clear-Eventlog -Log Application, System"działa. Ale w dzienniku instalacji jest napisane The Log name "Setup" does not exist in the computer "localhost".:-( Wszelkie pomysły na wyczyszczenie dziennika instalacji?
Ivan
Ach tak, problem polega na tym, że dziennik instalacji jest technicznie innym rodzajem dziennika niż inne. Jest to dziennik operacyjny zamiast dziennika administracyjnego. Można wyczyścić dzienniki administratora i dzienniki operacji za pomocą klasy .NET EventLogSession, ale to polecenie cmdlet programu PowerShell najwyraźniej nie używa tej klasy .NET. :( Zamiast tego spróbuj użyć tego polecenia, aby wyczyścić WSZYSTKIE dzienniki: Get-WinEvent -ListLog * -Force |% {Wevtutil.exe cl $ _. Logname}
Ryan Ries
Co więcej, po prostu zastąp gwiazdkę listą dzienników, które chcesz wyczyścić. Aplikacja, konfiguracja, bezpieczeństwo ... itd.
Ryan Ries
Wydaje się działać, ale mówi „Nie można wyczyścić dziennika DebugChannel. Żądanej operacji nie można wykonać na włączonym kanale bezpośrednim. Kanał należy najpierw wyłączyć przed wykonaniem żądanej operacji”.
Ivan
2
W dzienniku systemu zawsze będą znajdować się zdarzenia „Log Clear”. Zawsze. Nawet jeśli wyczyścisz dziennik systemu jako ostatni, pozostanie co najmniej jedno zdarzenie czyszczenia dziennika dla samego dziennika systemu. Nie martw się błędem DebugChannel, ponieważ jest to kolejny wyjątkowy przypadek. Wystarczy użyć konkretnych nazw dzienników zdarzeń, które chcesz wyczyścić, zamiast gwiazdki. Działa to w obu kierunkach, ale nie próbuj wyczyścić kanału DebugChannel, jeśli nie chcesz zobaczyć błędu.
Ryan Ries,
8

wevtutil enum-logswyliczy wszystkie dzienniki w systemie, a wevtutil clear-logwyczyści dzienniki. W twoim przypadku byłoby to:

wevtutil clear-log Application
wevtutil clear-log Security
wevtutil clear-log Setup
wevtutil clear-log System

Możesz również wykonać kopię zapasową podczas czyszczenia wevtutil clear-log System /backup:backup.evtx

mprill
źródło
2

W przypadku, gdy chcesz wyczyścić wszystkie dzienniki :

for /f %x in ('wevtutil el') do wevtutil cl "%x"

Wydobyto stąd .

Sopalajo de Arrierez
źródło
2

Poniższy PowerShell usuwa programowo wszystkie dzienniki zdarzeń na komputerze lokalnym, w tym dzienniki operacyjne / debugowania / instalacji (bez tworzenia procesu „wevtutil”). Aby wyczyścić tylko jeden dziennik, odpowiednio zmodyfikuj kod. Nie jest to idealne, jednak czasami dzienniki debugowania są przez coś otwierane, a to nie generuje żadnych błędów.

$EventLogs=Get-WinEvent -Force -ListLog *
$EventSession=new-object System.Diagnostics.Eventing.Reader.EventLogSession
foreach ($Log in $EventLogs) {
  if ($Log.IsEnabled) {
    if ($Log.RecordCount -gt 0) { 
      if ($Log.LogType -eq "Debug") {
        $Log.IsEnabled=$false
        $Log.SaveChanges()
        $EventSession.ClearLog($Log.LogName)
        $Log.IsEnabled=$true
        $Log.SaveChanges()
      }
      else { $EventSession.ClearLog($Log.LogName) }
  }
}
Slogmeister Extraordinaire
źródło
0

Oto jak wyczyścić cały dziennik zdarzeń za pomocą programu PowerShell, upewnij się, że używasz go jako administrator

wevtutil el | Foreach-Object {wevtutil cl "$_"}

neoghost
źródło
2
Ta odpowiedź wymaga wyjaśnienia.
kasperd