Получить имя пользователя из доступного файла - PullRequest
0 голосов
/ 22 октября 2011

Я хотел бы получить имя пользователя файла, к которому был получен доступ (добавить, удалить, переименовать, ...). на самом деле я использую filesystemwatcher для контроля доступа к файлам и активировал доступ к объектам в каталоге для получения информации о пользователях через журналы событий. Это решение не является идеальным, поскольку файловых событий много, а сообщения журнала событий не так детализированы. есть только один идентификатор события для записи данных. это используется для добавления файла, переименования, перемещения, ... каждой записи данных. Кроме того, мне пришлось перепроверить, что сообщение журнала событий соответствует событию filesystemwatcher. Я бы предпочел справиться с этим лучше. так что я трачу много времени на гугл, чтение, ... я знаю, что есть еще один пост на 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 и кодом примера я не могу получить имя пользователя.

1 Ответ

1 голос
/ 22 октября 2011

Из моей последней программы (2 недели назад) - меня попросили проверить изменения в файлах (также имя пользователя)

Решение было от filesystemwatcher и после события -> Перейти в журнал событий Windows и поиск 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;
        }
...