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
相关产品推荐
相关产品推荐

