使用VSS进行PST文件备份

在处理如Microsoft Outlook的PST文件备份时,通常会遇到一些限制,比如只能使用特定的备份工具,如Microsoft Backup。但如果只想备份PST文件,并且希望备份副本能够立即被访问,而不是压缩在BKF文件中,那么Microsoft Volume Shadow Copy Service(VSS)是一个解决方案。VSS是微软备份和其他备份工具能够复制锁定文件的方式。

当第一次开始研究Volume Shadow Copy时,并不清楚从何开始。曾以为可能需要创建并注册一个提供者。但后来,Craig Andera的HOBOCOPY博客帖子中的一位评论者提到了一个VSSCoordinatorClass,这正是需要的。VSSCoordinatorClass似乎没有文档记录。如果在Google上搜索它,只能找到原始的博客评论以及一两个非官方且不太有帮助的参考资料。MSDN也没有提到它。这个类似乎暴露了IVssBackupComponents接口的方法,这是创建影子副本所需要的。

创建影子副本的步骤

要创建一个卷影副本,需要执行以下步骤:

  • 使用StartSnapshotSet创建一个快照集
  • 使用AddToSnapshotSet将卷添加到快照集中
  • 使用DoSnapshotSet初始化卷影副本
  • 等待QueryStatus指示快照已被初始化
  • 使用GetSnapshotProperties获取快照的卷名
  • 使用FindFile和CopyFile API访问影子卷
  • 完成后,使用DeleteSnapshots方法表示不再需要影子卷

使用代码

附带的源代码是一个简单的实用程序,它扫描源目录和任何子目录以查找PST文件。找到的任何PST文件都被复制到目标目录。要使用此实用程序,请从Zip文件中提取文件。运行makeshadowcopy.exe,使用以下参数:

  • -F:表示“来自”目录。例如:C:\Documents and Settings\ttyree\Local Settings\Application Data\Microsoft\Outlook
  • -T:表示“到”目录。例如:C:\tedsoutlookbackup

请注意,默认情况下,这两个Windows服务设置为“手动”,并且需要启动Volume Shadow Copy才能工作:

  • Volume Shadow Copy服务
  • MS Software Shadow Copy Provider

代码示例

以下是一个封装了Volume Shadow Copy的类的示例。这个类使用卷名(例如:“C:”或“E:”)实例化,一旦实例化,DeviceName属性将返回影子卷的名称。完成影子卷的操作后,使用Delete方法释放它。

Public Class Snapshot ' Note: The following two windows services are stopped by default. ' ' For volume shadow copy to function ' ' they need to be started. ' Volume Shadow Copy service MS Software Shadow Copy Provider ' Technet article describing how Volume Shadow Copy works: ' http://technet2.microsoft.com/windowsserver/en/library/ ' 2b0d2457-b7d8-42c3-b6c9-59c145b7765f1033.mspx?mfr=true ' Thanks to Craig Andera for his HOBOCOPY blog ' posting which provided the basis for this code. ' http://www.pluralsight.com/blogs/craig/archive/2006/09/20/38362.aspx ' Note: More information about programming ' the volume shadow copy service is available here: ' http://msdn2.microsoft.com/en-us/library/aa384649.aspx ' Note: The microsoft volume shadow copy service ' SDK with headers and utilties is available here: ' http://www.microsoft.com/downloads/details.aspx? ' FamilyID=0B4F56E4-0CCC-4626-826A-ED2C4C95C871&displaylang=en Private Const VSS_E_BAD_STATE = &H80042301 ' ... 更多常量定义 ... Private moSnapshotSetID As New Guid Private moSnapshotID As New Guid Private msDeviceName As String Public Sub New(ByVal sVolume As String) Dim vss As New VSS.VSSCoordinatorClass Abort(vss) MakeNewSnapshot(vss, sVolume, moSnapshotSetID, moSnapshotID) msDeviceName = GetSnapshotDeviceName(vss, moSnapshotID) End Sub Public ReadOnly Property DeviceName() As String Get Return msDeviceName End Get End Property ' ... 更多方法定义 ... End Class
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485