Freigeben über


系统上的System Writer突然消失了

大家好,在最近的工作中,我的几位客户在Windows 2008的系统上遇到了系统备份失败的问题。这些问题有一个共同点是:当问题发生后,如果我们通过Vssadmin list writers去枚举系统上安装的VSS writers, System Writer在列表中消失了。而在系统备份之前,System Writer还处于 正常工作状态。

如果我们检查系统的事件日志,会在应用程序日志中发现类似于以下信息的记录

Log Name: Application

Source: Microsoft-Windows-CAPI2

EventID: 513

Level: Error

Description:
Cryptographic Services failed while processing the OnIdentity() call in the
System Writer Object.

Details:
AddCoreCsiFiles : RtlConvertNtFilePathToWin32Path() failed.

注意: 在具体的信息描述中,不同系统所报告的问题函数名称有可能不同。

在联系微软之前,许多客户已经在Internet上查询了许多相似的讨论,例如https://support.microsoft.com/kb/2009272。但是很多问题还是无法得到解决。有的客户甚至收集 了VSS的Event Tracing日志,仍然无法定位到问题。

 由于这个问题在不同客户的系统 中集中体现,我抽了一些时间来研究System Writer的具体行为。发现通过一些我们常用的调试工具,我们还是可以 很方便地定位到问题。

首先,System Writer是运行在Cryptographic Services服务中个一个组件。这也就是为什么系统日志 中会出现Microsoft-Windows-CAPI2的错误信息。我们可以尝试跟踪Cryptographic Services来了解System Writer的一些具体行为。

另外,根据https://technet.microsoft.com/en-us/library/bb968827(VS.85).aspx 提供的信息,System Writer主要用于协助系统提供以下文件的快照:

  • All the installed Static files
  • Windows Side-by-Side (WinSxS) directory
  • All PnP files for installed drivers (owned by PnP).
  • All user-mode services and non-PnP drivers.
  • All catalogs owned by CryptSvc.

简单来说,System Writer只提供一些系统文件的快照服务。

最后,我们可以通过事件日志中的信息,例如RtlConvertNtFilePathToWin32Path,来确认引起问题的的确是一些文件系统相关的操作。在理解了System Writer的行为后,通过我们常用的Process Monitor工具,https://technet.microsoft.com/en-us/sysinternals/bb896645,我们可以定位到导致问题的具体位置。

  1. 使用tasklist /svc来确认Cryptographic Services运行的SVChost.exe的进程ID.
  2. Process Monitor跟踪问题重现的整个过程并设置合适的过滤条件。
  3. 在Process Monitor,我们会看到Cryptographic Services进行大量的文件访问。我们不需要检查所有文件的访问结果。只需要注意最后一个文件或文件夹的访问。通常,这个文件也就是导致系统事件日志中特定文件操作失败的原因。

当理解了文件访问异常的原因后,我们可以相应的找到解决问题的方法。例如,在我遇到的一个案例中,Process Explorer最后显示如下的结果。

svchost.exe       912         QueryDirectory              
C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\xxxxxx\assembly\dl3

svchost.exe      912         CloseFile               
C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\ xxxxxx\assembly\dl3

正常情况下,当系统QueryDirectory之后,应该会枚举其中的文件。但在这个例子中,系统马上关闭了该文件夹的句柄。显然,对该文件夹的访问出现异常。 当我们简单移除这个文件夹后,系统恢复正常。

 

  本博文仅供参考,微软公司对其内容不作任何责任担保或权利赋予