Программно определить пользователя, который последний измененный файл на Windows?

Мне было поручено написать простую утилиту командной строки на C#, которая будет контролировать каталог на сервере, к которому несколько пользователей будут обращаться для копирования/вырезания/вставки/просмотра данных. Я использовал FileSystemWatcher чтобы сделать это, но ему не хватает нескольких функций.

можно ли определить пользователей или хотя бы имя компьютера из файла осуществляется/изменен?

(Примечание: это не должно быть с FileSystemWatcher, я ищу любой способ сделать это.)

2 ответов


Я не думаю, что вы сможете контролировать с помощью C# напрямую. Во всяком случае, без помощи операционной системы хоста. Windows и NTFS позволяют вам проводить аудит определенного каталога и регистрировать доступы в журнале событий безопасности для хост-машины (поэтому сервер, на котором размещается общий ресурс, должен будет проводить аудит, а не клиент).

С KB310399-как проверить доступ пользователей к файлам, папкам и принтерам в Windows XP

Аудит Доступа Пользователей файлов, папок и принтеров

журнал аудита отображается в журнале безопасности в средстве просмотра событий. Чтобы включить эту функцию:

  1. Нажмите кнопку Пуск, выберите Панель управления выберите производительность и обслуживание и затем нажмите кнопку администрирование.
  2. дважды щелкните значок Локальная политика безопасности.
  3. на левой панели дважды щелкните Локальные политики, чтобы развернуть его.
  4. в левой области щелкните политика аудита, чтобы отобразить параметры политики в правой области.
  5. дважды щелкните доступ к объекту аудита.
  6. чтобы проверить успешный доступ к указанным файлам, папкам и принтерам, установите флажок успешно.
  7. чтобы проверить неудачный доступ к этим объектам, установите флажок сбой.
  8. чтобы включить аудит обоих, установите оба флажка.
  9. нажмите OK.

указание файлов, папок и принтеров для аудита

после включения аудита можно указать файлы, папки и принтеры, которые требуется проверить. Для этого:

  1. в Проводнике Windows найдите файл или папку, которые требуется проверить. Для аудита принтера найдите его, нажав кнопку Пуск, а затем принтеры и факсы.
  2. щелкните правой кнопкой мыши файл, папку или принтер, который требуется проверить, а затем выберите Свойства.
  3. перейдите на вкладку Безопасность и нажмите кнопку Дополнительно.
  4. перейдите на вкладку аудит и нажмите кнопку Добавить.
  5. в поле Введите имя объекта для выбора введите имя пользователя или группы, доступ к которым вы хотите проверить. Для поиска имен на компьютере щелкните дополнительно, а затем в диалоговом окне Выбор пользователя или группы выберите команду найти сейчас.
  6. нажмите OK.
  7. установите флажки успешно или неудачно для действий, которые требуется проверить, и нажмите кнопку ОК.
  8. Нажмите кнопку ОК, а затем нажимать OK.

процесс аналогичен для серверных операционных систем и Windows Vista и Windows 7. Если вы идете по этому маршруту, вы можете попросить программу C# прочитать журнал событий (см. EventLog class), чтобы искать нужные вам данные.

Примечание: начиная с vista, вы должны быть и (UAC повышен, если необходимо) администратором, чтобы прочитать их из кода.


убедитесь, что на вашем ПК установлен или включен WMI, а также добавьте ссылку на System.Management и System.Management.Instrumentation Как хорошо. Существует также C# и VB WMI scripting application GUI, который вы можете скачать для запуска и тестирования запросов WMI, а также Google. Поскольку я работаю в Департаменте обороны, есть определенные вещи, которые я могу получить отсюда в отношении интернета, другие вещи заблокированы, поэтому, пожалуйста, простите меня, если я не публикую определенные веб-ссылки.

здесь что - то, чтобы вы начали

    ManagementScope mgtScope = new ManagementScope("\\ComputerName\root\cimv2");
    // you could also replace the username in the select with * to query all objects
    ObjectQuery objQuery = new ObjectQuery("SELECT username FROM Win32_ComputerSystem");

    ManagementObjectSearcher srcSearcher = new ManagementObjectSearcher(mgtScope, objQuery);

    ManagementObjectCollection colCollection = srcSearcher.Get();

    foreach (ManagementObject curObjCurObject in colCollection)
    {

        Console.WriteLine(curObjCurObject["username"].ToString());
    } 

  //if you want ot get the name of the machine that changed it once it gets into that  Event change the query to look like this. I just tested this locally and it does work 

    ManagementObjectSearcher mosQuery = new ManagementObjectSearcher("SELECT * FROM Win32_Process WHERE ProcessId = " + Process.GetCurrentProcess().Id.ToString());
    ManagementObjectCollection queryCollection1 = mosQuery.Get();
    foreach (ManagementObject manObject in queryCollection1)
    {
        Console.WriteLine("Name : " + manObject["name"].ToString());
        Console.WriteLine("Version : " + manObject["version"].ToString());
        Console.WriteLine("Manufacturer : " + manObject["Manufacturer"].ToString());
        Console.WriteLine("Computer Name : " + manObject["csname"].ToString());
        Console.WriteLine("Windows Directory : " + manObject["WindowsDirectory"].ToString());
    }