Windows启动初期C#服务读取System32文件报写保护错误,后续可正常读取
关于Windows 10启动阶段System32目录核心文件读取报错的解答
首先明确结论:Windows启动初期确实会对System32目录下的核心系统二进制文件施加临时保护机制,该保护会在系统核心组件初始化完成后自动解除,报错现象和服务未设置启动顺序依赖直接相关。
报错原因
- Windows启动流程中,会话管理器(Smss.exe)、Windows启动进程(Wininit.exe)等核心组件初始化阶段,会对正在加载的svchost.exe、csrss.exe等System32核心二进制文件施加独占读锁或临时写保护状态,避免启动过程中文件被篡改,保障启动安全。由于服务未设置启动依赖,默认自动启动的服务会在核心组件尚未完成初始化时就开始运行,此时尝试读取被锁的文件就会触发
System.IO.IOException:The media is write protected报错。 - 你使用的
File.OpenRead方法默认的文件共享模式为FileShare.Read,仅允许其他进程读取该文件,不允许其他进程写入,刚好撞上系统对文件施加临时写锁的场景时,就会因为权限冲突抛出异常。
解决方案
- 调整服务启动依赖:给你的服务添加启动依赖,设置依赖RPCSS(远程过程调用服务)、Winmgmt(Windows管理规范服务)、EventLog(系统日志服务),以上服务启动完成代表系统核心组件初始化基本结束,临时文件保护已经解除。可通过以下命令配置:
注意sc config 你的服务名称 depend= RPCSS/Winmgmt/EventLogdepend=参数后需要保留一个空格。 - 优化文件读取逻辑:将
File.OpenRead替换为显式指定共享模式的文件打开方式,允许其他进程同时读写该文件,降低锁冲突概率:using (var md5 = System.Security.Cryptography.MD5.Create()) { using (var stream = File.Open(absolutePathToProcess, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { var hash = md5.ComputeHash(stream); return hash; } } - 增加异常重试逻辑:服务轮询过程中捕获该类IO异常,遇到时跳过当前轮询周期,等待下一个周期重试即可,无需中断服务运行。也可以在服务首次启动时增加30~60秒的延迟启动逻辑,等系统启动流程完全结束后再开始轮询。
内容的提问来源于stack exchange,提问作者Liviu Stancu
相关产品推荐
相关产品推荐

