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

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/EventLog
    
    注意depend=参数后需要保留一个空格。
  • 优化文件读取逻辑:将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:15:03