获取已接收文件的用户名

时间:2011-10-22 17:57:41

标签: c# filesystemwatcher netapi32

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

Get username of opened file

但我认为应该有一个可能的解决方案,因为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和示例代码我无法获取用户名。

1 个答案:

答案 0 :(得分:1)

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

解决方案是通过filesystemwatcher并在事件发生后 - &gt;转到windows的事件日志和bu Xpath搜索 - 找到哪个用户进行了操作。

   public static EventUnit DisplayEventAndLogInformation(string fileToSearch, DateTime actionTime)
        {
            StringBuilder sb = new StringBuilder();
            const string queryString = @"<QueryList>
  <Query Id=""0"" Path=""Security"">
    <Select Path=""Security"">*</Select>
  </Query>
</QueryList>";
            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;
        }