耳机没声音,先别急着调均衡器
用户反馈耳机音效不对,按往常经验,多半是驱动或音效增强软件的问题。但这次我多留了个心眼------最近系统刚推过一轮 Windows 更新,会不会是更新把默认播放设备改了?
于是把任务拆成两条线并行:一条查音频端点状态,一条核实 Windows Update 到底装了什么、有没有翻车。
注册表读不动,换条路走
第一轮诊断很快卡住:脚本里用 reg.exe 读注册表,直接被沙箱黑名单拦截。
换用 .NET 的 Registry API 原生读取,结果第二轮脚本跑到一半又崩了。好在 2a 的事件日志部分拿到了关键数据,没白跑。
这里踩的第一个坑:沙箱环境下外部命令不可靠,原生 API 也可能因为权限或环境问题中途挂掉。 解决办法是把任务拆细,先快速测权限,再跑全量分析。
最终定位到端点状态存在 DeviceState 这个命名值里。全量跑完后,出来一个关键差异:
- 「耳机」端点当前是
not present(state=4) - 活动的 Realtek 端点是「扬声器」
也就是说,系统当前默认播放设备根本不是耳机。为了确认,我又用 COM API 去查默认播放设备到底是什么、用的什么格式。
Probe 返回空、编译报错、脚本编码,三个坑连着来
COM API 第一次跑,结果为空------异常被吞了。加上错误捕获重跑,才看到真实报错。
接着是编译错误:tag == 65534 超出 short 范围。小问题,改成正确的类型比较即可。
最坑的是最后一个:脚本在空结果查询上直接挂了。改用 try/catch 重写后,又踩中记忆里那个老坑------
PowerShell 5.1 按 GBK 读取 UTF-8 无 BOM 脚本时,中文标点 。 在 -replace 字符串里会吃掉引号,导致语法错误。
重写为纯 ASCII 后终于跑通。这个坑我之前遇到过,这次还是中招,说明光记笔记不够,得在脚本模板层面直接禁用非 ASCII 字符。
WU 侧没翻车,但 Defender 崩了一整天
Windows Update 那边信息量很大:更新确实开着,但都在正常安装,没有失败记录。
不过顺手查 Defender 网络检查服务时发现了异常------它今天频繁崩溃。
抓 Application 日志的 1000 事件,看到崩溃模块是 NisSrv.exe。更关键的时间线:
- 今天 12:56 平台更新到 4.18.26090.9
- 更新后崩溃风暴没有停
- 14:48 还在持续崩溃
这说明不是一次性的安装抖动,而是平台更新引入的持续性问题。
可带走的方法
这次排查有几点值得记下来:
- 音频问题先查端点状态,别急着调音效。
DeviceState=4意味着设备不在位,默认设备可能已经漂移到扬声器。 - 沙箱里别依赖
reg.exe,用 .NET Registry API,但要做好异常捕获和分段执行。 一次跑全量很容易中途崩掉,拿不到任何数据。 - PowerShell 脚本尽量写纯 ASCII。 PS 5.1 的编码问题会在你最意想不到的地方咬你一口,尤其是
-replace里带中文标点的时候。 - 查更新影响时,别只看更新成功没成功。 要顺着时间线看更新后的服务崩溃日志,
NisSrv.exe这种平台组件更新后持续崩溃,往往比更新本身更值得处理。
耳机音效的问题最终定位到端点状态异常,而系统更新本身没翻车,真正需要跟进的是 Defender 网络检查服务的持续崩溃。两条线分开查,反而都查出了东西。
做自动化这几年,最耗时间的从来不是写代码,是摸清每个平台的脾气。
这篇里提到的坑,都是真金白银踩出来的。 如果你手上也有重复度很高的活儿------批量发布、数据搬运、有固定规则的机械操作 ------可以在评论区说说你的场景,我看看能不能自动化掉。