哪个用户导致了FileSystemWatcher事件?

时间:2009-08-17 04:20:37

标签: c# filesystemwatcher

例如,我可以捕获文件夹树中各种文件的Delete事件,但是如何确定哪个用户导致删除?

我在FileSystemWatcher的MSDN文档中找不到任何明显的东西,所以也许这是不可能的。如果有解决方案,我会很好奇。

3 个答案:

答案 0 :(得分:4)

FileSystemWatcher的当前实现目前无法实现这一点,因为当删除文件或文件的任何内容发生更改时,它不会收到此类信息。

答案 1 :(得分: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)));
}

答案 2 :(得分:1)

看起来.NET中没有任何可以帮助你的功能,但是在Netapi32.dll中的函数NetFileGetInfo的帮助下,它应该是可能的。

查看用户dave4dl已发布代码示例的this thread,其中显示了如何执行此操作。