一位团队成员通知我,我们的一台基于 Windows Server 2008(不是 2008 R2)的 MSSQL 服务器已开始在应用程序事件日志中生成 CAPI2 事件 ID 513 错误:
Application\CAPI2
Cryptographic Services failed while processing the OnIdentity() call in the System Writer Object.
Details:
AddCoreCsiFiles: BeginFileEnumeration() failed.
System Error: Access is denied.
通过 PowerShell 的简单操作可以发现,该问题始于 2014 年 8 月 6 日,并且主要发生在每天 22:00 之后:
PS C:\Users\Administrator> Get-EventLog -LogName Application | ? { $_.EventID -like "513" -and $_.Source -like "Microsoft-Windows-CAPI2" } | Select -Property TimeGenerated
TimeGenerated
-------------
8/18/2014 10:41:32 AM
8/18/2014 10:25:17 AM
8/18/2014 10:15:20 AM
8/17/2014 10:55:41 PM
8/17/2014 10:55:27 PM
8/17/2014 10:55:26 PM
8/16/2014 10:49:44 PM
8/16/2014 10:49:28 PM
8/16/2014 10:49:28 PM
8/15/2014 10:52:11 PM
8/15/2014 10:51:58 PM
8/15/2014 10:51:57 PM
8/15/2014 1:03:06 AM
8/15/2014 1:02:45 AM
8/15/2014 1:02:45 AM
8/13/2014 10:58:49 PM
8/13/2014 10:58:32 PM
8/13/2014 10:58:31 PM
8/12/2014 10:57:09 PM
8/12/2014 10:56:56 PM
8/12/2014 10:56:56 PM
8/11/2014 10:56:13 PM
8/11/2014 10:55:56 PM
8/11/2014 10:55:55 PM
8/10/2014 10:50:15 PM
8/10/2014 10:50:04 PM
8/10/2014 10:50:03 PM
8/10/2014 7:12:09 AM
8/10/2014 7:11:52 AM
8/10/2014 7:11:51 AM
8/8/2014 10:57:00 PM
8/8/2014 10:56:44 PM
8/8/2014 10:56:43 PM
8/6/2014 9:47:26 PM
8/6/2014 9:47:03 PM
8/6/2014 9:47:02 PM
8/6/2014 10:48:33 AM
好奇吧?我想知道 System Writer 对象是用来做什么的?卷影复制!哦,天哪!本月我开始使用 Veeam 对该虚拟机进行基于 VSS 的应用程序感知备份。备份过程自然从 22:00 开始,这解释了重复的频率,而不是错误只是在“随机”时间发生。
有趣的是,Veeam 并没有将此视为备份失败,这让我怀疑还原点是实际上是事务一致的。无论如何,我快速搜索了 Veeam 备份日志,没有发现任何明显的错误,但可能值得仔细检查它们并确认从这些还原点进行的恢复是事务一致的。
这事件 ID 513 TechNet 参考推荐的解决方案表明 NTFS 权限问题可能是造成故障的原因,但是C:\Windows\Registration
COM+ 注册文件夹具有适当的权限。
有想法吗?
答案1
马蒂亚斯·R·杰森让我找到了正确的方向,那就是著名的 WinSxS 文件夹。但是,我没有在事件日志中看到任何 VSS 错误,这让我有点犹豫是否要删除所有 NTFS 权限,以免破坏其他内容。
第一课:阅读
我回去读了事件 ID 513 TechNet 参考并指出,根据核实部分建议我检查是否System Writer
可用作 VSS 编写器vssadmin list writers
,但果然不行。经验教训 #1:阅读整个 KB/TechNet/博客
第 2 课:复制
经过进一步的研究,我发现缺少系统写入器案例解释这似乎表明问题出在加密服务。我发现可以CAPI2
通过停止和启动服务随意重现错误CryptSVC
。经验教训#2:尝试找出一种方法来随意重现你的错误。
使用 ProcMon
在这一点上,我基本上遵循了帖子的说明。我使用以下代码找到了svchost
正在包装的实例的 PID:CryptSVC
任务管理器。您也可以CryptSVC
使用以下方法强制作为自己的进程运行配置您是否可以重新启动相关服务器。根据您对 ProcMon 的了解程度,有必要将服务隔离在单个 PID 下,以减少您必须整理的事件数量。
从这里开始,它又回到了旧的 ProcMon。设置一个过滤器以排除所有不是由svchost
包装进程使用的 PID CryptSVC
:
第 3 课:热爱 ProcMon
我应用了我信赖的第一道过滤程序,即排除所有结果为 的事件SUCCESS
。这样,事件数从 31,118 减少到更易于管理的 139,在底部,我找到了ACCESS DENIED
我正在寻找的事件,不出所料,它就在WinSxS
文件夹 ( C:\Windows\winsxs\FileMaps\$$.cdf-ms
) 中。经验教训 #3:学会使用和热爱 ProcMon
第 4 课:验证
怎么办?KB2009272Mathias 链接中有解决方案,但是现在我知道为什么。经验教训#4:不要猜测,要了解!
第 5 课:从小事做起
解决方案正如解释的那样KB2009272. 获取所有权并重置文件夹的权限FileMaps
,然后重新启动CryptSVC
:
Takeown /f %windir%\winsxs\filemaps\* /a
icacls %windir%\winsxs\filemaps\*.* /grant "NT AUTHORITY\SYSTEM:(RX)"
icacls %windir%\winsxs\filemaps\*.* /grant "NT Service\trustedinstaller:(F)"
icacls %windir%\winsxs\filemaps\*.* /grant BUILTIN\Users:(RX)
net stop cryptsvc
net start cryptsvc
然后……我们起飞了!System Writer
现在可以作为 VSS 编写器使用了。无需更改PendingRename
文件夹的权限。经验教训#5:从最小的改变开始,然后逐步实现对更多事物产生影响的改变。
C:\Users\administrator>vssadmin list writers
vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool
(C) Copyright 2001-2005 Microsoft Corp.
Writer name: 'System Writer'
Writer Id: {e8132975-6f93-4464-a53e-1050253ae220}
Writer Instance Id: {98c52075-429a-4487-8b77-e42b18767458}
State: [1] Stable
Last error: No error
随意重新启动CryptSVC
不会再产生CAPI2
错误,经过一两天的监控后,它看起来已经解决了。