Подтвердить что ты не робот

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

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

Можно ли определить пользователь или, по крайней мере, имя компьютера, из которого файл обращается или изменяется?

(Примечание: это не обязательно для FileSystemWatcher, я ищу ЛЮБОЙ способ сделать это.)

4b9b3361

Ответ 1

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

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

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

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

  • Нажмите "Пуск", выберите "Панель управления", "Производительность и обслуживание", а затем "Администрирование".
  • Дважды щелкните Локальная политика безопасности.
  • В левой панели дважды щелкните Локальные политики, чтобы развернуть его.
  • В левой панели выберите политику аудита, чтобы отобразить отдельные параметры политики на правой панели.
  • Дважды щелкните доступ к объекту Аудит.
  • Чтобы проверить успешный доступ к указанным файлам, папкам и принтерам, установите флажок Успех.
  • Чтобы проверить безуспешный доступ к этим объектам, установите флажок "Сбой".
  • Чтобы включить аудит обоих, установите оба флажка.
  • Нажмите "ОК" .

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

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

  • В проводнике Windows найдите файл или папку, которые вы хотите проверить. Чтобы проверить принтер, найдите его, нажав кнопку "Пуск", а затем "Принтеры и факсы".
  • Щелкните правой кнопкой мыши файл, папку или принтер, который вы хотите проверить, и нажмите "Свойства".
  • Перейдите на вкладку "Безопасность" и нажмите "Дополнительно".
  • Перейдите на вкладку "Аудит" и нажмите "Добавить".
  • В поле "Введите имя объекта для выбора" введите имя пользователя или группы, доступ к которым вы хотите проверить. Вы можете просмотреть компьютер для имен, нажав кнопку "Дополнительно", а затем "Найти сейчас" в диалоговом окне "Выбор пользователя или группы".
  • Нажмите "ОК" .
  • Установите флажки "Успешно или Неудачно" для действий, которые вы хотите проверить, а затем нажмите "ОК" .
  • Нажмите "ОК" , а затем "ОК" .

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

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

Ответ 2

Убедитесь, что WMI установлен или включен на вашем ПК, также не забудьте добавить ссылку на System.Management и System.Management.Instrumentation. Существует также графический интерфейс приложения сценариев С# и VB WMI, который вы можете загрузить для запуска и тестирования запросов 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());
    }