代码之家  ›  专栏  ›  技术社区  ›  Ash

哪个用户导致了文件系统监视程序事件?

  •  1
  • Ash  · 技术社区  · 15 年前

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

    我在文件系统监视程序的msdn文档中找不到任何明显的内容,所以可能这是不可能的。不过,我想知道是否有解决办法。

    3 回复  |  直到 12 年前
        1
  •  4
  •   Scott Dorman    15 年前

    对于当前的filesystemwatcher实现来说,这是不可能的,因为在删除文件或任何有关文件更改的信息时,它都不会收到此类信息。

        2
  •  3
  •   Ignacio Calvo    12 年前

    可以使用文件夹审核(文件夹属性>安全性>高级选项>审核),然后在文件系统观察程序事件激发后查找安全事件日志。

    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)));
    }
    
        3
  •  1
  •   René    12 年前

    在.NET中似乎没有任何功能可以帮助您实现这一点,但是在该功能的帮助下 NetFileGetInfo 在netapi32.dll中,这是可能的。

    看一看 this thread 用户dave4dl发布了一个代码示例,演示了如何执行该操作。