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

108
我正在编写一个PowerShell脚本,用于使用rsync备份Windows计算机。为此,我尝试从该脚本中使用WMI创建一个非持久性的带有写入器参与的Shadow副本(这似乎是备份推荐的方法)。
我从另一个问题(通过Powershell访问卷影副本(VSS)快照)中找到了一种创建通用阴影副本的方法,但那里给出的示例使用"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}

根据相关文档(Win32_ShadowCopy类的创建方法),返回值意味着“不支持的影像副本上下文”。
我找不到任何相关文档说明为什么不支持这个上下文,或者是否可以使用它。我还尝试了“FileShareBackup”和“AppRollback”上下文,但没有成功。
我猜我可能漏掉了一些明显的东西,WMI可能真的只支持“clientAccessible”来创建影像副本,或者这取决于操作系统(我在64位的Windows 7上进行测试)。
我该如何让它工作?

3
我刚才自己写了同样的东西(但是使用的是C#和AlphaVSS库),这是我学到的:为了同步文件,你需要挂载快照,但是要让快照能够被挂载,必须将 NoAutoRelease 标志设置为 true。另外,要将 NoAutoRelease 设置为 true,必须将 Persistent 设置为 true。所以,只是提醒您不要花太多时间尝试让除 ClientAccessable 之外的其他东西工作(ClientAccessable 同时设置了这两个变量为 true)。 - Scott Chamberlain
3
如果您无法让WMI正常工作,可以尝试在PowerShell中加载AlphaVSS程序集。[这里是使用C#创建、挂载和删除快照的方法](http://pastebin.com/XhVLyq0m),您应该能够将其翻译成PowerShell代码。 - Scott Chamberlain
11
我想我应该回复一下,为了让任何人都能受益。简而言之:是的,可以使用AlphaVSS来完成我想做的事情,但这并不是一个简单的过程。编写支持带有写入器备份的代码基本上意味着在PowerShell中重新编写大部分VShadow,这感觉像是一个毫无意义的练习。无论如何,在使用非持久性快照时,关键是在调用BackupComplete()之前执行所有实际的备份操作。据我所知,快照将在调用BackupComplete()时立即销毁。 - Julien Picalausa
2
@JulienPicalausa,除非您认为还有其他更好的答案,否则您应该将其粘贴并标记为答案 ;) - Jaykul
1
你好!你解决了这个Shadow Copy上下文问题吗?我也遇到了同样的问题,我用PowerShell编写了一个备份脚本,但它不允许我使用备份上下文。只有ClientAccessible和NASRollback,这对我来说不合适。 - Frigo
显示剩余5条评论
2个回答

1

好的,我是一个有用的助手,我会翻译文本。

好的,Technoob1984在这里报道。请看我附上的屏幕截图。

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

影像副本上下文就是对象的.properties文件。

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

https://learn.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 的内容。
请看我的截图: enter image description here 因此,Shadow Context 是 'Caption, Count, Description' 和 .Properties 值下的任何其他内容。我没有看到 'Backup' 作为其中一个选项。
  • 享受

这是一个旧的帖子,有很多浏览量。你可以找到很多类似的问题。微软的文档很令人困惑。不过这个评论就是答案,我保证!! - Technoob1984
1
“Caption”、“Count”和“Description”是“Win32_ShadowCopy”属性的名称,而不是上下文的名称。“ClientAccessible”恰好是两个类中上下文和属性的名称。通过查询“Win32_ShadowContext”实例,问题得到了正确解答。 - Lance U. Matthews

-6

根据错误信息,您的$shadow返回值为5,您的影子ID全部为零,您需要在注册表中添加1或2到卷影副本的末尾,使用二进制dword

在您的regedit中查找名为volsnap的文件夹,搜索.volsnap.sys,它位于C:\Windows\System32\drivers目录下。文件大小为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版本。


7
这个答案似乎没有意义。问题在于未创建阴影副本。我不知道查找volsnap.sys文件与此有什么关系,也不知道为什么您认为将默认ID从空GUID更改为-01会有所帮助。 - Corrodias
1
这是由GPT编写的吗? - Armen Michaeli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接