例如,我可以捕获文件夹树中各种文件的 Delete 事件,但我将如何确定是哪个用户导致了删除的发生?
我在 FileSystemWatcher 的 MSDN 文档中找不到任何明显的东西,所以也许这是不可能的。但是,我很好奇是否有解决方案。
例如,我可以捕获文件夹树中各种文件的 Delete 事件,但我将如何确定是哪个用户导致了删除的发生?
我在 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 中似乎没有任何内置功能可以帮助您,但是借助NetFileGetInfo
Netapi32.dll 中的功能,它应该是可能的。
看看这个线程,用户 dave4dl 发布了一个代码示例,展示了如何做到这一点。