Мне нужно найти способ автоматически переименовывать все файлы, созданные в определенном каталоге на файловом сервере Windows 2008r2. Это нужно делать более или менее мгновенно, поэтому я не могу запускать запланированное задание каждые 5 минут или около того.
Я провел некоторое исследование и выяснил, что могу сделать это, запланировав запуск задачи при создании файла сигнализации событий WMI, но я действительно не знаю, с чего начать, поэтому мне нужны некоторые указатели.
Было бы достаточно просто создать сценарий PS, который находит файл и переименовывает его, но я действительно не знаю, как запустить сценарий при правильном событии.
Прежде всего, включите аудит файлов в «Администрирование» -> «Локальная политика безопасности» -> «Локальные политики» -> «Политика аудита» -> «Аудит доступа к объектам».
Здесь вы хотите включить оба Failure
& Success
После этого щелкните правой кнопкой мыши папку, в которой будут созданы папки, и перейдите в раздел «Дополнительно» в свойствах. Там у вас будет вкладка Auditing
. Добавьте его для всех пользователей и проверьте все варианты (Успешно)
Затем создайте папку в папке и откройте eventvwr
. Здесь вы увидите запись в журналах аудита для создания папки. Щелкните его правой кнопкой мыши и добавьте к нему действие.
В качестве задачи вы можете запустить PowerShell.exe
и в качестве аргумента вы можете указать свой скрипт:
.\MyScript.ps1 -eventRecordID $(eventRecordID) -eventChannel $(eventChannel)
(Вам не нужно передавать аргументы, если вы не собираетесь с ними ничего делать)
Я думал об этом, но мне нравится TiZon's лучше. Это был код, который я нашел некоторое время назад, но необходимость в нем отпала, поэтому я никогда особо не использовал его.
' VBScript source code
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & _
strComputer & "\root\cimv2")
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _
("Select * From __InstanceCreationEvent Within 5 Where " _
& "Targetinstance Isa 'CIM_DirectoryContainsFile' and " _
& "TargetInstance.GroupComponent= " _
& "'Win32_Directory.Name=""c:\\\\scripts""'")
Do
Set objLatestEvent = colMonitoredEvents.NextEvent
Wscript.Echo objLatestEvent.TargetInstance.PartComponent
Loop
Из CodeProject.
Я никогда не пробовал, но Пакет PowerShell включает FileSystemWatcher, который может запускать ваш монитор предупреждений. Видеть эта тема для примера использования.
Очевидно, что ваш сценарий PowerShell должен работать постоянно.
Однако одна из ваших самых больших проблем с любой система запуска заключается в том, что вы обычно получаете уведомление о том, когда создание файла начинается а не после завершения, поэтому ваш файл может все еще использоваться, когда вы пытаетесь его переименовать. Чтобы обойти это, вашему коду триггера, возможно, придется проверять успешность переименования и продолжать попытки время от времени, пока это не произойдет.
Вы также должны быть осторожны с тем, как создаются файлы. Например, я видел программы, которые в первую очередь создают файлы, такие как filename.ext.temp, а после завершения переименовывают файл в собственное имя, например, filename.ext. В этом случае вы действительно хотите отслеживать не создание файла, а его переименование.