2 Stimmen

Welcher Benutzer verursachte FileSystemWatcher-Ereignisse?

Zum Beispiel kann ich das Ereignis "Löschen" für verschiedene Dateien in einem Ordnerbaum abfangen, aber wie würde ich vorgehen, um festzustellen, welcher Benutzer das Löschen verursacht hat?

Ich konnte in der MSDN-Dokumentation für FileSystemWatcher nichts Offensichtliches finden, also ist es vielleicht einfach nicht möglich. Ich wäre aber neugierig, ob es eine Lösung gibt.

4voto

Scott Dorman Punkte 41206

Dies ist derzeit mit den aktuellen Implementierungen des FileSystemWatcher nicht möglich, da er diese Art von Informationen nicht erhält, wenn eine Datei gelöscht wird oder sich etwas an einer Datei ändert.

4voto

Ignacio Calvo Punkte 689

Es ist möglich, die Ordnerüberwachung zu verwenden (Ordnereigenschaften > Sicherheit > Erweiterte Optionen > Überwachung) und dann im Sicherheitsereignisprotokoll nachzusehen, nachdem das FileSystemWatcher-Ereignis ausgelöst wurde.

string GetUser(string path) {
    object nowDate = Now;
    GetUser = "Unknown";
    Threading.Thread.Sleep(1000);
    // # Search user in the security event log
    object secLog = new EventLog("Security", EVENTLOGSERVER);
    EventLogEntry entry;
    for (int i = (secLog.Entries.Count - 1); (i <= Math.Max((secLog.Entries.Count - 1500), 0)); i = (i + -1)) {
        entry = secLog.Entries(i);
        if (IsValidEntry(path, nowDate, entry)) {
            GetUser = entry.ReplacementStrings(11);
            break;
        }
    }
}

bool IsValidEntry(string path, DateTime nowDate, EventLogEntry entry) {
    return ((entry.EntryType == EventLogEntryType.SuccessAudit) 
        && ((entry.InstanceId == 560) || (entry.InstanceId == 564)) 
        && !entry.UserName.EndsWith("SYSTEM")
        && (Math.Abs(nowDate.Subtract(entry.TimeGenerated).TotalSeconds <= 20) 
        && (entry.ReplacementStrings.GetUpperBound(0) >= 11) 
        && (entry.ReplacementStrings(2).Length >= 4) 
        && path.EndsWith(entry.ReplacementStrings(2).Substring(4)));
}

1voto

René Punkte 9554

Es scheint keine in .NET integrierte Funktionalität zu geben, die Ihnen dabei helfen kann, aber mit Hilfe der Funktion NetFileGetInfo in Netapi32.dll, sollte es möglich sein.

Werfen Sie einen Blick auf dieses Thema wo der Benutzer dave4dl ein Codebeispiel gepostet hat, das zeigt, wie man es macht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X