例如,我可以捕獲文件夾樹中各種文件的Delete事件,但是我將如何確定哪個用戶導致刪除發生?哪個用戶導致FileSystemWatcher事件?
我在FileSystemWatcher的MSDN文檔中找不到任何明顯的東西,所以也許它是不可能的。如果有解決方案,我會很好奇。
例如,我可以捕獲文件夾樹中各種文件的Delete事件,但是我將如何確定哪個用戶導致刪除發生?哪個用戶導致FileSystemWatcher事件?
我在FileSystemWatcher的MSDN文檔中找不到任何明顯的東西,所以也許它是不可能的。如果有解決方案,我會很好奇。
這對於FileSystemWatcher的當前實現當前不可行,因爲當文件被刪除或文件的任何內容發生更改時,它不會收到此類信息。
可以使用文件夾審覈(文件夾屬性>安全>高級選項>審覈),然後在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)));
}
它似乎並不像有內置到.NET的任何功能,可以幫你,但在NETAPI32.DLL功能NetFileGetInfo
的幫助下,它應該是可能的。
看看this thread,其中用戶dave4dl發佈了一個代碼示例,演示如何執行此操作。
你知道在.NET應用程序中這是否可能?或者我需要深入研究Win API? – Ash 2009-08-17 04:43:52
@Ash:如果可能的話,您將需要使用Win32 API調用。我不確定你需要使用哪些API,但是最終你會寫出自己的文件系統觀察者版本。 – 2009-08-17 14:10:28