2009-08-17 41 views
1

例如,我可以捕獲文件夾樹中各種文件的Delete事件,但是我將如何確定哪個用戶導致刪除發生?哪個用戶導致FileSystemWatcher事件?

我在FileSystemWatcher的MSDN文檔中找不到任何明顯的東西,所以也許它是不可能的。如果有解決方案,我會很好奇。

回答

4

這對於FileSystemWatcher的當前實現當前不可行,因爲當文件被刪除或文件的任何內容發生更改時,它不會收到此類信息。

+0

你知道在.NET應用程序中這是否可能?或者我需要深入研究Win API? – Ash 2009-08-17 04:43:52

+0

@Ash:如果可能的話,您將需要使用Win32 API調用。我不確定你需要使用哪些API,但是最終你會寫出自己的文件系統觀察者版本。 – 2009-08-17 14:10:28

3

可以使用文件夾審覈(文件夾屬性>安全>高級選項>審覈),然後在FileSystemWatcher事件觸發後查找安全事件日誌。

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

它似乎並不像有內置到.NET的任何功能,可以幫你,但在NETAPI32.DLL功能NetFileGetInfo的幫助下,它應該是可能的。

看看this thread,其中用戶dave4dl發佈了一個代碼示例,演示如何執行此操作。