2009-08-17 12 views
1

Zum Beispiel kann ich das Delete-Ereignis für verschiedene Dateien in einer Ordnerstruktur abfangen, aber wie würde ich herausfinden, welcher Benutzer das Löschen verursacht hat?Welcher Benutzer hat FileSystemWatcher-Ereignisse verursacht?

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

Antwort

4

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 irgendetwas an einer Datei ändert.

+0

Wissen Sie, ob dies in einer .NET-Anwendung überhaupt möglich ist? Oder müsste ich mich in die Win API vertiefen? – Ash

+0

@Ash: Sie müssen Win32-API-Aufrufe verwenden, wenn es überhaupt möglich ist. Ich bin mir nicht sicher, welche APIs Sie verwenden müssten, aber Sie werden letztendlich Ihre eigene Version eines Dateisystem-Wächters schreiben. –

3

Es ist möglich, Ordnerüberwachung zu verwenden (Ordner Eigenschaften> Sicherheit> Erweiterte Optionen> Überwachung) und dann das Sicherheitsereignisprotokoll nach dem FileSystemWatcher-Ereignis zu suchen.

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))); 
} 
1

Es scheint nicht, wie jede Funktionalität in .NET gebaut gibt es, dass Sie mit dem, aber mit Hilfe der Funktion NetFileGetInfo in Netapi32.dll helfen kann, sollte es möglich sein.

Werfen Sie einen Blick auf this thread, wo der Benutzer dave4dl ein Codebeispiel gepostet hat, das zeigt, wie es geht.

Verwandte Themen