获取已接收文件的用户名

我想获取被访问文件的用户名(添加,删除,重命名,…)。 实际上,我使用filesystemwatcher来监视文件访问,并且我已经在目录上激活了对象访问,以通过事件日志获取用户信息。 这个解决方案并不完美,因为有很多文件事件,事件日志消息也不那么详细。 写数据只有一个事件id。 它用于添加文件,重命名,移动,…每个写入数据。 另外,我必须交叉检查事件日志消息是否与filesystemwatcher事件匹配。 我宁愿更好地处理这个问题。 所以我花了很多时间googleing,阅读,…我知道stackoverflow上有另一篇文章

获取已打开文件的用户名

但我认为应该有一个可能的解决方案,因为Windows Events可以获得用户名。

阅读几页后我发现应该有一个使用netapi32.dll的可能解决方案。 http://vbcity.com/forums/t/133307.aspx?PageIndex=2上的示例代码对我不起作用。 我无法获取fileid所以我将代码更改为

private ulong GetFileIdFromPath(string filePath) { WinAPI.BY_HANDLE_FILE_INFORMATION objectFileInfo = new WinAPI.BY_HANDLE_FILE_INFORMATION(); Thread.Sleep(200); FileInfo fi = new FileInfo(filePath); FileStream fs = fi.Open(FileMode.Open, FileAccess.Read, FileShare.Read); WinAPI.GetFileInformationByHandle(fs.Handle, out objectFileInfo); fs.Close(); ulong fileIndex = ((ulong)objectFileInfo.FileIndexHigh << 32) + (ulong)objectFileInfo.FileIndexLow; return fileIndex; } 

使用此代码,我能够获取fileid但是使用fileid和示例代码我无法获取用户名。

从我的上一个程序(2周前) – 我被要求审核文件的更改(也是用户名)

解决方案是通过filesystemwatcher并在一个事件之后 – >转到windows的事件日志和bu Xpath搜索 – 找到哪个用户进行了操作。

  public static EventUnit DisplayEventAndLogInformation(string fileToSearch, DateTime actionTime) { StringBuilder sb = new StringBuilder(); const string queryString = @"    "; EventLogQuery eventsQuery = new EventLogQuery("Security", PathType.LogName, queryString); eventsQuery.ReverseDirection = true; EventLogReader logReader = new EventLogReader(eventsQuery); EventUnit e = new EventUnit(); bool isStop = false; for (EventRecord eventInstance = logReader.ReadEvent(); null != eventInstance; eventInstance = logReader.ReadEvent()) { foreach (var VARIABLE in eventInstance.Properties) if (VARIABLE.Value.ToString().ToLower().Contains(fileToSearch.ToLower()) && actionTime.ToString("d/M/yyyy HH:mm:ss") == eventInstance.TimeCreated.Value.ToString("d/M/yyyy HH:mm:ss")) { foreach (var VARIABLE2 in eventInstance.Properties) sb.AppendLine(VARIABLE2.Value.ToString()); e.Message = sb.ToString(); e.User = (eventInstance.Properties.Count > 1) ? eventInstance.Properties[1].Value.ToString() : "n/a"; e.File = fileToSearch; isStop = true; break; } if (isStop) break; try { // Console.WriteLine("Description: {0}", eventInstance.FormatDescription()); } catch (Exception e2) { } } return e; }