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

FileStream处于打开状态时如何仅允许特定进程读取对应文件?

仅允许指定进程读取已打开文件的实现方案

Windows原生的FileShare机制是全局规则,不能直接按进程做访问过滤,要实现你的需求有两种可行路径:

方案1:基于DACL(访问控制列表)实现(推荐,开发成本低)

这个方案通过限制文件的访问权限范围,配合放宽共享规则实现,不需要额外依赖:

  • 打开文件前先修改目标文件的访问控制列表,清空所有无关用户的访问权限,仅保留你当前程序的运行用户、目标进程的运行用户的读取权限
  • 打开文件时把FileShare参数调整为FileShare.Read,此时只有被加入权限列表的用户对应的进程可以读取文件,其他进程访问会直接被系统拒绝
  • 如果需要按PID/进程名动态放行,可以搭配进程轮询逻辑:检测到目标进程启动时将其运行用户加入DACL,目标进程退出后删除对应权限
    示例代码:
using System.Diagnostics;
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;

// 先配置文件访问权限
var fileInfo = new FileInfo(FILE);
var fileSecurity = fileInfo.GetAccessControl();
// 清除所有用户的默认访问权限
fileSecurity.PurgeAccessRules(new SecurityIdentifier(WellKnownSidType.WorldSid, null));
// 给当前进程用户加读权限
fileSecurity.AddAccessRule(new FileSystemAccessRule(
    WindowsIdentity.GetCurrent().Name, 
    FileSystemRights.Read, 
    AccessControlType.Allow));
// 给目标进程用户加读权限,targetPid替换为你要放行的进程PID
var targetProcess = Process.GetProcessById(targetPid);
string targetProcessUser = GetProcessUser(targetProcess); // 自行实现获取进程运行身份的方法
fileSecurity.AddAccessRule(new FileSystemAccessRule(
    targetProcessUser, 
    FileSystemRights.Read, 
    AccessControlType.Allow));
fileInfo.SetAccessControl(fileSecurity);

// 再打开文件,允许有权限的进程读取
FileStream fileStream = new FileStream(FILE, FileMode.Open, FileAccess.Read, FileShare.Read);

方案2:基于文件过滤驱动实现(粒度更细)

如果必须严格按PID/进程名过滤,不限制用户身份,可以用Windows Minifilter文件过滤驱动实现:

  • 开发轻量过滤驱动拦截所有对该文件的访问请求
  • 拦截到请求后校验发起进程的PID/名称,仅放行你自己的进程和指定目标进程的访问请求,其他所有请求直接返回拒绝
  • 这个方案控制精度更高,但需要管理员权限运行,开发复杂度也更高

注意事项

  • 两种方案都需要程序以管理员权限运行,修改文件DACL和安装过滤驱动都需要高权限
  • 程序退出前记得恢复文件原来的DACL配置,避免后续其他正常访问被拦截

内容的提问来源于stack exchange,提问作者Flint Charles

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:51:01