You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

除审计外,如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:46:32