环境
Windows 7 Professional SP1 PL,已加入域。
问题
自 2014-06-12 以来,我们的几台计算机(但绝对不是全部,至少现在还不是)出现了打印机共享问题,很快这个问题被解释为 Windows 防火墙服务处于离线状态。
尝试启动 Windows 防火墙服务失败,服务返回错误编号 5(“拒绝访问”)。
Windows EventLog 显示问题始于上述日期,并且在每天早上启动时或在任何手动服务启动尝试时重复出现。
诊断
在 Google 的帮助下,我们很快发现问题与访问以下注册表项的子项有关:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\SharedAccess
有几个网站认为问题是由于对该键的一些重要子键的访问权限不足而导致的NT Service\MpsSvc
。最权威的来源似乎是 Microsoft 知识库文章KB943996。虽然这篇文章是关于 Windows Vista 的,但它提供了一个更通用的网站链接,防火墙修复工具。
我们尝试应用知识库中的建议,并得出以下结果:
- 我们能够验证只有
\Epoch
子项缺少建议的 ACL 集。 - 我们无法
NT Service\MpsSvc
手动添加,因为 Windows 无法找到此类用户。我们检查了适当的搜索范围(本地计算机)并启用了所有对象类型。我们已确定,此帐户可以在健康的机器上正确找到和使用。 - FixIt 工具确实正确地
\Epoch
为NT Service\MpsSvc
(!) 的子项分配了权限,但是它并没有解决问题,Fixit 工具本身在运行后测试中也承认了这一点。
我们已经验证了上述注册表项是解决问题的关键。我们通过分配可继承Full Access
权限来实现这一点Everyone
- 有了这些权限,Windows 防火墙服务确实可以正常启动。然而,由于明显的安全问题,这并不能解决我们的问题。我们需要的是正确地修复它。
在进一步调查过程中,我们尝试使用以下方法监控上述密钥:Sysinternals 进程监视器。我们已经确定,Windows 防火墙服务在ACCESS DENIED
我们\Epoch2
不知道的子项之后失败。
使用具有本地管理员权限的帐户运行时regedit.exe
,我们无法看到该子项。但该项清晰可见:
- 在健康的机器上,使用相同的权限,
- 在受影响的计算机上,
regedit.exe
以SYSTEM
用户身份运行 (psExec -s -i regedit.exe
)
子项的 ACL 中列出的帐户Epoch2
也缺少NT Service\MpsSvc
条目。在受影响的计算机上,这些帐户是:
CREATOR OWNER
SYSTEM
Administrators
Users
LOCAL SERVICE
在健康/未受影响的机器上,条目正确运行如下:
CREATOR OWNER
SYSTEM
Administrators
Users
MpsSvc
由于我们无法手动分配这些权限,因此我们不知道下一步该做什么。
范围和意义
该问题仅在少数地区被报告,但在我们能够详细验证的第一个地区,大约 50% 的计算机受到影响。
该问题也可能影响其他领域。由于它需要用户与受影响的 Windows 功能进行交互(在受影响的计算机共享的打印机上打印),因此与问题的可能范围相比,用户报告可能很少。
虽然共享打印机现在并不常见,但该功能并不是一个真正的问题。但防火墙瘫痪肯定是一个需要解决的问题。
结果
一:我们不知道什么可能导致了这个问题。
所有计算机(受影响的和健康的)都在受控的软件安装环境中运行。用户没有管理权限,软件通过以下方式自动部署:工作量. 上述所有计算机都具有相同的软件配置文件 - 这意味着安装了相同的软件产品。这些计算机甚至在硬件方面也完全相同,都是在同一批次中采购的,并且具有连续的序列号。
我们的主要怀疑与问题发生的常见时间有关,是最近的 2014-06-10 Windows 更新中存在的一些选择性问题。不幸的是,我们完全无法在我们的时间快照虚拟测试机中重现此问题,因此这种怀疑有点牵强。
然而,找到根源很重要,这不仅是为了解决问题,也是为了避免将来再次发生。
二:我们没有满意的想出解决问题的办法。我们正在考虑:
- 通过一些命令行 ACL 工具为用户添加权限
MpsSvc
,虽然这会花费大量的时间和人力,但问题开始蔓延; - 也许可以通过 GPO 部署这些权利(GPO 会接受这里的任何用户),但我们首先必须正确地确定这些
\Epoch2
权利是唯一缺少的权利。
在尝试采取任何激进的措施之前,我们很乐意听取一些意见。最重要的是,以前的经验、解决方案的想法和关于该问题可能根源的想法。
也许最近其他人也遇到了这个问题?
答案1
几天来我一直在与同样的问题作斗争,我NT Service\MpsSvc
在检查注册表项权限时也无法看到该帐户。显然这是设计使然(?),NT Service\MpsSvc
帐户可用Full Control
,但隐藏了;您只需在 [添加...] 对话框中手动输入它即可。完成此操作并在密钥上提供帐户后Shared Access
,Windows 防火墙现在就可以正常启动。
我只能说,相比之下,带有 iptables 的 Linux 简直是简单的奇迹。