在 PowerShell 中使用“备份”上下文创建卷影副本

Posted

技术标签:

【中文标题】在 PowerShell 中使用“备份”上下文创建卷影副本【英文标题】:Creating a shadow copy using the "Backup" context in a PowerShell 【发布时间】:2013-07-10 04:41:53 【问题描述】:

我正在编写一个用于使用 rsync 备份 Windows 计算机的 PowerShell 脚本。为此,我正在尝试使用上述脚本中的 WMI 来创建一个有作者参与的非持久卷影副本(显然建议用于备份)。

我从另一个问题 (Accessing Volume Shadow Copy (VSS) Snapshots from powershell) 中发现了一种创建卷影副本的一般方法,但那里给出的示例使用“ClientAccessible”作为上下文参数,这会导致创建持久卷影副本,而无需作家参与。

在寻找解决方案时,我发现我可以使用以下命令来获取上下文列表,我假设 WMI 可以理解:

Get-WmiObject win32_shadowcontext | Out-GridView

它确实有一个名为“备份”的上下文,这正是我想要的。我继续尝试使用该上下文创建非持久性卷影副本:

$shadow = (Get-WmiObject -list win32_shadowcopy).Create("C:\", "Backup")

但是,这似乎失败了,$shadow 变量的内容被设置为

ReturnValue      : 5
ShadowID         : 00000000-0000-0000-0000-000000000000

根据相关文档 (Create method of the Win32_ShadowCopy class),返回值表示“不支持的卷影复制上下文”。

我找不到任何相关文档说明为什么不支持此上下文或是否可以使用它。我也尝试过“FileShareBackup”和“AppRollback”上下文,但没有成功。

我认为我要么遗漏了一些明显的东西,要么由于某种原因,WMI 在创建卷影副本时确实不支持“clientAccessible”以外的任何东西,或者这是依赖于操作系统的(我正在 Windows 7 上进行测试, 64 位)

我怎样才能让它工作?

【问题讨论】:

我自己也写了同样的东西(但它是用 C# 和库 AlphaVSS),这是我学到的:你将需要挂载快照以获取文件以同步它,但要挂载快照必须将NoAutoRelease 标志设置为true。还要将NoAutoRelease 设置为true,您必须将Persistent 设置为true,所以仅供参考,这样您就不会花太多时间尝试让ClientAccessable 以外的其他东西工作(ClientAccessable 有两个变量都设置为true) 如果你不能让 WMI 工作,也许尝试将AlphaVSS assembly 加载到 Powershell。 Here is how to create a snapshot, mount it, and delete it in C#,你应该可以把它翻译成 powershell。 我认为我应该对此作出回应,以使任何阅读本文的人受益。简而言之:是的,可以使用 AlphaVSS 来完成我想要的,但这不是一件简单的事情。编写代码以正确支持编写器的备份几乎意味着在 PowerShell 中重写大部分 VShadow,这感觉像是一个毫无意义的练习。无论如何,在使用非持久性快照时,关键是在调用 BackupComplete() 之前执行所有实际的备份操作。据我了解,只要调用 BackupComplete(),快照就会被销毁。 @JulienPicalausa,除非您认为有比这更好的答案,否则您应该粘贴并将其标记为答案;) 您好!您是否设法找到此卷影复制上下文问题的解决方案?我有同样的问题,我在 PowerShell 中编写了一个备份脚本,但它不允许我使用备份上下文。只有 ClientAccessible 和 NASRollback,不适合我。 【参考方案1】:

好的,Technoob1984 来了。请参阅我附加的屏幕截图。

这个比较棘手,因为你必须使用x64版本的Powershell(位于system32而不是wow64下)

Shadow Copy Context 是对象的 .properties。

我在下面的截图中也使用了静态方法。

https://docs.microsoft.com/en-us/previous-versions/windows/desktop/vsswmi/create-method-in-class-win32-shadowcopy

# get existing shadow copies
$shadow = get-wmiobject win32_shadowcopy
"There are 0 shadow copies on this sytem" -f $shadow.count
""

# get static method
$class=[WMICLASS]"root\cimv2:win32_shadowcopy"

# create a new shadow copy
"Creating a new shadow copy"
$class.create("C:\", "ClientAccessible")

# Count again
$shadow = get-wmiobject win32_shadowcopy

所以在示例中,您可能希望使用 $class.Properties 来查看可以用作阴影上下文的内容。

查看我的屏幕截图:

所以 Shadow Context 是“标题、计数、描述”以及 .Properties 的“名称:”值下的任何其他内容。我不认为“备份”是选项之一。

享受

【讨论】:

这是一个有很多观点的老帖子。你可以找到很多类似的问题。 Microsoft 的文档令人困惑。不过,这条评论就是答案,我保证!!【参考方案2】:

您的$shadow 在查看错误消息时返回值为 5,您的影子 id 全部为零,您需要使用 二进制双字

在您的regedit 中找到注册表中名为volsnap 的文件夹,在C:\Windows\System32\drivers 目录中找到.volsnap.sys。文件大小为 52,352 字节。volsnap 文件包含 Microsoft 的数字签名,确保其字节正确。

这证实了它的真实性。 volsnap.sys 似乎是一个由 EXE-Packer 压缩的文件。特洛伊木马经常使用这种技术来保持文件大小较小并且妨碍调试工作。

但是,这本身并不足以构成恶意意图,因为即使是善意的专业软件生产商也会利用压缩文件。出于这个原因,2% 的专家认为这个文件是一个可能的威胁。它可能造成伤害的可能性很高。请考虑其他用户的额外评论。

  shadow id          default 
                        00000000-0000-0000-0000-000000000000
                        00000000-0000-0000-0000-000000000005

如果它已经有一个 5,它可能不会将其更改为 1

或创建新代码

Shadow id           $shadow 00000000-0000-0000-0000-0000000000001

不完全如图所示。你可能需要尝试不同的措辞我不确定$是否有效,如果没有,请尝试 js 独立版本。

【讨论】:

这个答案似乎是荒谬的。问题是没有创建卷影副本。我不知道定位 volsnap.sys 文件与此有什么关系,也不知道为什么您认为将默认 ID 从空 GUID 更改为 -01 会有所帮助。 这是 GPT 写的吗?

以上是关于在 PowerShell 中使用“备份”上下文创建卷影副本的主要内容,如果未能解决你的问题,请参考以下文章

Veeam Backup Free,Samba共享和PowerShell:拒绝访问

使用 Powershell 将 Azure 数据库备份到 blob

使用PowerShell脚本的Azure SQL备份自动化

Powershell + Nagios 监控 VEEAM 备份状态

从提示符运行 powershell 脚本时,SQL Server 2008 不使用备份设备路径

Powershell 停止 Azure 备份