我需要找到一种方法来自动重命名在 Windows 2008r2 文件服务器上特定目录中创建的所有文件。这需要或多或少立即完成,所以我不能每 5 分钟左右运行一次计划作业。
我做了一些研究并发现我可以通过安排任务来触发发出文件创建信号的 WMI 事件来做到这一点,但我真的不知道如何开始,所以我需要一些指点。
创建一个定位文件并重命名的 PS 脚本很容易,但我真的不知道如何在正确的事件上触发该脚本。
答案1
首先,在管理工具->本地安全策略->本地策略->审计策略->审计对象访问中启用文件审计。
在这里,您需要同时启用Failure
&Success
之后,右键单击要创建文件夹的文件夹,然后转到属性中的高级。在那里您将有一个选项卡Auditing
。为所有用户添加它并检查所有选项(成功)
然后,在文件夹中创建一个文件夹并打开eventvwr
。在这里,您将在审计日志中看到创建该文件夹的条目。右键单击它并在其上添加一个操作。
您可以启动任务PowerShell.exe
并可以提供脚本作为参数:
.\MyScript.ps1 -eventRecordID $(eventRecordID) -eventChannel $(eventChannel)
(如果您不打算用这些参数做任何事情,则不需要传递这些参数)
答案2
我从来没有尝试过,但是PowerShell 包包含一个可以触发警报监视器的 FileSystemWatcher。请参阅此主题作为示例用法。
您的 powershell 脚本显然需要持续运行。
然而,你最大的问题之一任何触发系统是你通常会在文件创建时收到通知开始而不是在重命名完成后才执行,因此当您尝试重命名文件时,文件可能仍在使用中。为了解决这个问题,您的触发器代码可能必须检查重命名是否成功,并不断尝试,直到成功为止。
您还需要注意文件的创建方式。例如,我见过一些程序首先创建 filename.ext.temp 之类的文件,完成后将文件重命名为正确的名称,即 filename.ext。在这种情况下,您实际上并不想监视文件的创建,而是想监视文件的重命名。
答案3
我曾经考虑过,但我喜欢TiZon 的更好。这是我之前找到的代码,但是现在不再需要它了,所以我从来没有真正用过它。
' 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
从代码项目。