除审计外,如何通过FileWatcher获取拖入监控文件夹的用户名?
捕获拖入监控文件夹的操作用户方案(全微软64位环境)
在全微软64位环境下,除了系统审计功能,你可以通过以下几种被动方式捕获拖入指定网络文件夹的操作用户:
1. WMI事件监听+文件ACL所有者查询
利用WMI监听文件创建事件,结合文件的ACL信息获取操作用户——手动拖入的文件,默认情况下操作账户会成为文件所有者。
示例PowerShell脚本:
# 替换为你的目标网络文件夹路径 $targetFolder = "\\your-domain-share\approved-docs" # 转换路径格式适配WMI查询 $wmiPath = $targetFolder.Replace('\', '\\') # 构建WMI查询,监听文件夹内的文件创建事件 $wmiQuery = @" SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'CIM_DataFile' AND TargetInstance.Path = '$wmiPath' "@ # 注册WMI事件并定义触发动作 Register-WmiEvent -Query $wmiQuery -Action { $file = $event.SourceEventArgs.NewEvent.TargetInstance try { $acl = Get-Acl $file.Name $operator = $acl.Owner Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 文件 $($file.FileName).$($file.Extension) 由 $operator 拖入" } catch { Write-Warning "无法获取文件 $($file.Name) 的操作用户: $($_.Exception.Message)" } } Write-Host "WMI监控已启动,按Ctrl+C终止" while ($true) { Start-Sleep 5 }
2. FileSystemWatcher结合.NET ACL查询
用原生的FileSystemWatcher被动监听文件创建事件,触发后通过.NET API读取文件的所有者信息,适合编写C#等编译型程序部署。
示例C#代码片段:
using System; using System.IO; using System.Security.AccessControl; using System.Security.Principal; class FileDropMonitor { static void Main(string[] args) { string monitorPath = @"\\your-domain-share\approved-docs"; using (var watcher = new FileSystemWatcher(monitorPath)) { watcher.Created += OnFileDropped; watcher.EnableRaisingEvents = true; Console.WriteLine("监控已启动,按任意键退出..."); Console.ReadKey(); } } private static void OnFileDropped(object sender, FileSystemEventArgs e) { try { // 等待文件完全写入 System.Threading.Thread.Sleep(1000); var fileSec = File.GetAccessControl(e.FullPath); var owner = fileSec.GetOwner(typeof(NTAccount)).Value; Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] 文件 {e.Name} 由 {owner} 拖入"); } catch (Exception ex) { Console.WriteLine($"处理文件 {e.Name} 出错: {ex.Message}"); } } }
3. 轻量化PowerShell FileSystemWatcher监控
如果不需要编译程序,用纯PowerShell实现FileSystemWatcher监控,逻辑和上面一致,更适合快速部署:
$monitorPath = "\\your-domain-share\approved-docs" $watcher = New-Object System.IO.FileSystemWatcher -Property @{ Path = $monitorPath IncludeSubdirectories = $false EnableRaisingEvents = $true } # 注册文件创建事件 Register-ObjectEvent $watcher "Created" -Action { $filePath = $event.SourceEventArgs.FullPath # 等待文件释放锁 Start-Sleep -Seconds 1 try { $acl = Get-Acl $filePath $operator = $acl.Owner Write-Host "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] 捕获操作: $operator 拖入文件 $filePath" } catch { Write-Warning "获取文件 $filePath 用户信息失败: $($_.Exception.Message)" } } Write-Host "监控已启动,按Ctrl+C停止" while ($true) { Start-Sleep 3 }
注意事项
- 确保监控程序/服务的运行账户拥有目标共享文件夹的读取权限,才能获取文件的ACL信息。
- 若文件是从同一服务器的其他文件夹剪切过来,原所有者可能会被保留;但手动拖入的场景大多是跨位置复制/移动,操作账户会成为新文件的所有者,符合你的需求。
- 跨域环境下需确认域信任关系正常,保证监控账户能跨域访问共享文件夹的安全数据。
内容的提问来源于stack exchange,提问作者Paul Wichtendahl
相关产品推荐
相关产品推荐

