Weiß jemand, ob es möglich ist, die Windows-Ereignisprotokolle aus einem bestimmten Zeitintervall als Textdatei mit C# zu speichern? Beispiel: Ich möchte die Systemereignisprotokolle zwischen 10 und 11 Uhr in einer Textdatei speichern. Wenn es möglich ist, hat jemand einen Link zu einem guten Tutorial oder vielleicht ein Code-Snippet, das mich in Gang bringen könnte? Ich habe online gesucht, kann aber nicht bekommen, wonach ich suche.Verwenden Sie C#, um Ereignisprotokolle von einem bestimmten Zeitraum zu sammeln
Antwort
gerade hinzufügen, Informationen für andere, wie Ereignisprotokolle von Zeitbereich als Teil der WMI-Abfrage zu filtern.
Beachten Sie, dass 'TimeGenerated' ist, wenn Ereignisse auftreten und 'TimeWritten', wenn sie protokolliert werden. Die 'RecordNumber' ist ein eindeutiger Index, der nützlich ist, um eine Kollision oder doppelte Protokollierung zu verhindern.
Es gibt System.Management.ManagementDateTimeConverter, das zwischen C# DateTime und dem WMI CIM_DATETIME-Format konvertiert. Beachten Sie jedoch, dass das UTC CIM zu einer LOCAL DateTime wird, während Kind Unspecified verlassen wird. Setzen Sie Kind danach, um Kopfschmerzen zu vermeiden!
Dies ist ein Beispiel für die Ergreifung Sicherheitslücken in den letzten 30 Minuten (Aussperrungen zu verfolgen):
private void SearchEventViewer(string computerName, string userName, string userPass)
{
var scope = CreateManagementScope(computerName, userName, userPass);
var startTime = ManagementDateTimeConverter.ToDmtfDateTime(DateTime.UtcNow.AddMinutes(-30));
var query = new SelectQuery("SELECT * FROM Win32_NTLogEvent WHERE Logfile = 'Security' AND EventType = '5' AND TimeGenerated > '" + startTime + "'");
using (var searcher = new ManagementObjectSearcher(scope, query))
{
var result = searcher.Get();
foreach (var item in result)
{
var eventTimeLocal = DateTime.SpecifyKind(ManagementDateTimeConverter.ToDateTime(item["TimeGenerated"].ToString()), DateTimeKind.Local);
var eventTimeUtc = eventTimeLocal.ToUniversalTime();
var eventDetails = item["Message"].ToString().Replace("\r\n\r\n", "\r\n");
eventDetails += "\r\nEventCode: " + item["EventCode"];
eventDetails += "\r\nCatogory: " + item["Category"];
eventDetails += "\r\nRecord Number: " + item["RecordNumber"];
eventDetails += "\r\nLocal Time: " + eventTimeLocal.ToString("yyyy-MM-dd HH:mm:ss");
// Do something...
}
}
}
private ManagementScope CreateManagementScope(string computerName, string username = "", string password = "")
{
var managementPath = @"\\" + computerName + @"\root\cimv2";
var scope = new ManagementScope(managementPath);
if (username != "" && password != "")
{
scope.Options = new ConnectionOptions
{
Username = username,
Password = password,
Impersonation = ImpersonationLevel.Impersonate,
Authentication = AuthenticationLevel.PacketPrivacy
};
}
return scope;
}
Brilliant, genau das, was ich suchte. – DukeOfMarmalade