Windows多媒体站点权限配置:9年容器运维工程师的一键落地方案
|
跟产品吵完第三轮,我当场把 Windows 多媒体站点权限配置那个 YAML 拷贝进终端的时候,手指在键盘上悬了两秒——不是怕错,是怕他们下一秒又弹出个「需求变更通知」。结果 PM 靠在工位隔板边啃苹果,吐籽精准掉进我显示器右下角那个没关的录屏窗口里,画面抖了一下,时间戳停在下午三点零七分。 这个方案我敢打包票:优胜劣汰是真的。不是说它多聪明,是它根本不管你有没有加域、有没有开 UAC 提权、有没有在组策略里勾选「允许非管理员用户读取注册表项」——它直接绕过去,用 Windows Container Host Process 容器跑 hostnetwork 模式下的 media-service.exe,然后靠一个带 `SeTcbPrivilege` 的 service account 持有者去接管 `C:\\inetpub\\wwwroot\\media` 下所有 ACL。不修,不配,不点下一步。删掉 `IIS_IUSRS` 权限?删就删了。它启动时自己补三行 SDDL 字符串,一行都不带犹豫。 我原以为得手写一个 PowerShell 临时提升上下文再挂载 volume,结果去年1月份测试那回,后端老陈连着敲了六次 `docker run --privileged` 启动失败,第七次他换了一根银色 Anker 充电线插主机 USB-C 口,容器居然就起来了——ACL 补全日志在 Event Viewer 里打了个绿勾,时间戳和充电线插拔间隔二十三秒。这个我说不准是不是巧合,但那个绿勾我看了七遍,绝对没眼花。 顺手提一嘴 CDN 账单的事儿:上个月 Azure Front Door 突然多出十八毫秒延迟,查出来是某台 media-server 在响应 206 Partial Content 时,硬塞了个 `Content-Range: bytes 0-372/372` 给 MP4 片段,而 CDN 缓存层认出这玩意儿没校验 `Last-Modified`,就甩了 12 小时过期头……账单涨得比我们 KPI 折算还离谱。可这跟权限没关系,我就随便念叨念叨,你别当真。 具体怎么一键落地?第一步:改 Dockerfile,把 `FROM mcr.microsoft.com/windows/servercore:ltsc2022` 换成 `hostprocess` 标签那个;第二步:不是加 ADD,是 `COPY media-service.exe C:\\\\service\\\\`;第三步——最关键——`RUN sc.exe create "MediaSvc" binPath= "C:\\service\\media-service.exe" start= auto obj= ".\\svc-host" password= "xxx"`;第四步:删掉 `Dockerfile` 里所有 `USER ContainerUser`;第五步:`docker build -t media-win:v2.8 .`;第六步:`docker run -d --name media-host --isolation=host --network=host --restart=always -v C:\\media-data:C:\\media-data media-win:v2.8`;第七步:进去手动 `icacls C:\\media-data /grant "NT AUTHORITY\\SYSTEM:(OI)(CI)F" /T` ——等等,这步不用干,脚本里早埋好了,我刚刚手抖又多敲了一遍,删了删了。 Lighthouse 跑分截图发到群里没人回。我截的是 Performance 里的 `Total Blocking Time` 和 `Cumulative Layout Shift`,两个红框都盖住了右上角水印,PM 还问是不是盗图。前端小吴当时正趴在桌上改 React.lazy 加载逻辑,听见“盗图”抬头看了眼,说了句“你上次用 Chrome 114 测的?”就没再吭声。桌面那个没关的录屏还在跑,进度条停在 00:42:17,我懒得动鼠标。
文章配图,仅供参考 失败案例有俩:一个是某客户硬要在 `Server 2019 LTSC` 上跑 hostprocess 容器,结果 kernel mode 驱动兼容性崩了,media-service.exe 始终卡在 `STATUS_DLL_NOT_FOUND`;另一个更绝——IT 部门把服务器加入域后自动启用「强制 Kerberos 认证加密」,容器内 `net use \\\as\\share` 直接拒绝连接,日志里报 `0x80070035`,查三天才发现是 SMB 签名开关被策略锁死。所以这方案优胜劣汰是真的:活下来的全是没加域、没开 GPO、没装防病毒钩子驱动的干净裸机。你拿它上生产环境?得先筛人。 谁去倒水?上周四,是前端小吴。他路过茶水间看见烧水壶在滴漏,顺手拔了插头,拧紧底座橡胶圈,又把空杯子全收进消毒柜——但我猜他压根没注意壶盖上贴着的便签写着「权限组更新中,暂停使用 1.12–1.15」。这事儿跟我无关,但每次看见消毒柜门上反光映出我后脑勺,就想起来那天水壶底下积水已经漫到瓷砖缝了。 我试过让 Ansible 串起整套流程,跑通一次后删掉了 playbooks:太重。现在本地就留三个文件——一个 27 行的 build.ps1,一个 14 行的 deploy.bat,一个叫 `acl-reset.bak` 的文本,里面写着三行乱码 SDDL 字符串,实际没用,但每次有人问「权限到底在哪设?」我就扔这个文件过去。信不信由你。 目前能推到生产的只有物理机或专用 Hyper-V 宿主。云上暂不推荐,尤其 Azure VM 的 Windows 更新机制会偷偷把 `Container Isolation Level` 切回 process 模式,且重启后不报错——得等客户投诉「视频第一帧黑三秒」才翻日志发现。我正在写个检测 hook,放在 startup task 里跑 `systeminfo | findstr "Isolation"`,要是返回 `HostProcess` 就啥也不干,要是返回空……就发邮件抄送所有人,并附上一张刚煮开的水壶照片。 先这样吧。明早九点我要去机房给三台旧物理机做 hostprocess 补丁预热,顺便看看那台一直报 `ERROR_FILE_CORRUPT` 的 NAS 是不是真的坏了——或者只是上次权限脚本执行一半断电,导致 NTFS $MFT 里残留了一个指向不存在 `S-1-5-21-...-1001` 的 ACL 条目。管他呢。反正现在脚本跑完,我只认绿勾。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

