如何使用 Powershell 启用卷影复制?

如何使用 Powershell 启用卷影复制?

如何在特定驱动器(D:、E:、...)上启用卷影复制并使用 Powershell 设置计划?

我只需要一些关于如何开始的提示。

答案1

您可以使用 WMI 对象在特定驱动器上创建卷影副本,如Microsoft 文章

在特定驱动器(D:、E:、...)上启用卷影复制是两件事

  1. 按照上一篇文章所示创建卷影副本
  2. 创建计划任务以创建卷影副本

答案2

我花了一点时间才让它工作起来(在找到导致它失败的简单错误之后),而且功能不完整。我想添加在远程计算机上启用它的功能,这可能需要通过运行一次的任务来完成。如果有人修改了这个并添加了那个,请告诉我!

function Enable-ShadowCopies {
param(
    [String]$ComputerName = $Env:ComputerName,

    [Parameter(Mandatory=$true)]
    [String]$Drive
)
$volumeWMI = Get-WmiObject -ComputerName $ComputerName -Class Win32_Volume -Filter "DriveLetter = '$Drive'";
$volumeID = ($volumeWMI.DeviceID.SubString(10)).SubString(0,($volumeWMI.DeviceID.SubString(10)).Length-1);

$scheduler = New-Object -ComObject Schedule.Service
$scheduler.Connect($ComputerName)
$tskDef = $scheduler.NewTask(0);
$tskRegInfo = $tskDef.RegistrationInfo;
$tskSettings = $tskDef.Settings;
$tskTriggers = $tskDef.Triggers;
$tskActions = $tskDef.Actions;
$tskPrincipals = $tskDef.Principal;

# Registration Info
$tskRegInfo.Author = "PowerShell Script";

# Settings
$tskSettings.DisallowStartIfOnBatteries = $false;
$tskSettings.StopIfGoingOnBatteries = $false
$tskSettings.AllowHardTerminate = $false;
$tskSettings.IdleSettings.IdleDuration = "PT600S";
$tskSettings.IdleSettings.WaitTimeout = "PT3600S";
$tskSettings.IdleSettings.StopOnIdleEnd = $false;
$tskSettings.IdleSettings.RestartOnIdle = $false;
$tskSettings.Enabled = $true;
$tskSettings.Hidden = $false;
$tskSettings.RunOnlyIfIdle = $false;
$tskSettings.WakeToRun = $false;
$tskSettings.ExecutionTimeLimit = "PT259200S";
$tskSettings.Priority = "5";
$tskSettings.StartWhenAvailable = $false;
$tskSettings.RunOnlyIfNetworkAvailable = $false;

# Triggers
$tskTrigger1 = $tskTriggers.Create(3);
$tskTrigger2 = $tskTriggers.Create(3);

## Trigger 1
$tskTrigger1.Id = "Trigger1"
$tskTrigger1.StartBoundary = (Get-Date -format "yyyy-MM-dd")+"T07:00:00";
$tskTrigger1.DaysOfWeek = 0x3E; # Monday - Friday - http://msdn.microsoft.com/en-us/library/windows/desktop/aa384024(v=vs.85).aspx
$tskTrigger1.Enabled = $true;

## Trigger 2
$tskTrigger2.Id = "Trigger2";
$tskTrigger2.StartBoundary = (Get-Date -format "yyyy-MM-dd")+"T12:00:00";
$tskTrigger2.DaysOfWeek = 0x3E; # Monday - Friday - http://msdn.microsoft.com/en-us/library/windows/desktop/aa384024(v=vs.85).aspx
$tskTrigger2.Enabled = $true;

# Principals (RunAs User)
$tskPrincipals.Id = "Author";
$tskPrincipals.UserID = "SYSTEM";
$tskPrincipals.RunLevel = 1;

 # Actions
$tskActions.Context = "Author"
$tskAction1 = $tskActions.Create(0);

# Action 1
$tskAction1.Path = "C:\Windows\system32\vssadmin.exe";
$tskAction1.Arguments = "Create Shadow /AutoRetry=15 /For="+$volumeWMI.DeviceID;
$tskAction1.WorkingDirectory = "%systemroot%\system32";

# Configure VSS, Add scheduled task
vssadmin Add ShadowStorage /For=$Drive /On=$Drive /MaxSize=10%;
$tskFolder = $scheduler.GetFolder("\")
$tskFolder.RegisterTaskDefinition("ShadowCopyVolume$volumeID", $tskDef, 6, "SYSTEM", $null,5);
}

尽管这有效,并且它模仿了通过 GUI 执行此操作时发生的情况,但它仍显示该驱动器已禁用。但如果您启用它,则不会发生任何变化!(大笑)我猜注册表中也需要修改一些东西。

答案3

$diskname = "C:\"
$VolumeWmi = gwmi Win32_Volume -Namespace root/cimv2 | ?{ $_.Name -eq $diskname }
$DeviceID = $VolumeWmi.DeviceID.ToUpper().Replace("\\?\VOLUME", "").Replace("\","")
$TaskName = "ShadowCopyVolume" + $DeviceID
$TaskFor = "\\?\Volume" + $DeviceID + "\"
$Task = "C:\Windows\system32\vssadmin.exe"
$Argument = "Create Shadow /AutoRetry=15 /For=$TaskFor"
$WorkingDir = "%systemroot%\system32"

$ScheduledAction = New-ScheduledTaskAction –Execute $Task -WorkingDirectory $WorkingDir -Argument $Argument
$ScheduledTrigger = @()
$ScheduledTrigger += New-ScheduledTaskTrigger -Daily -At 10:00
$ScheduledTrigger += New-ScheduledTaskTrigger -Daily -At 15:00
$ScheduledSettings = New-ScheduledTaskSettingsSet -Compatibility V1 -DontStopOnIdleEnd -ExecutionTimeLimit (New-TimeSpan -Days 3) -Priority 5
$ScheduledTask = New-ScheduledTask -Action $ScheduledAction -Trigger $ScheduledTrigger -Settings $ScheduledSettings
Register-ScheduledTask $TaskName -InputObject $ScheduledTask -User "NT AUTHORITY\SYSTEM"

经过大量的调整后,它的工作方式略有不同(它似乎也能通过 GUI 正确显示)。

向此页面致谢以获得一些帮助: https://social.technet.microsoft.com/forums/windowsserver/en-US/fb69840d-5f52-4711-8168-2faa23088233/shadow-copy-schedule-per-script

据我所知,使用 schtasks(该页面所使用的)的缺点是您不能拥有多个触发器。

此外,由于我解决问题的方式(使用了工作/不工作的 xml 的 bindiff),我不完全相信我使用的标志是最佳的。

答案4

卷影复制实际上是通过创建调用 vssadmin.exe 的任务来启用的。

PowerShell 3.0 具有可让您创建任务的 cmdlet,但这些 cmdlet 依赖于直到 Windows 8/Windows Server 2012 才实现的系统调用。您需要以下三个 cmdlet 才能以 PowerShell 方式执行此操作:

register-scheduledTask
new-scheduledtaskaction
new-scheduledtasktrigger

在早期版本的 Windows 中,您将被限制使用 schtasks.exe。

但是——这也是这个答案与其他答案不同的地方——以这些方式创建卷影复制任务并不是正确的做法,因为您所做的任何更改都不会显示在 GUI 中。因此,不注意的用户可能不知道已启用卷影复制,从而导致他们启用它的第二个实例,或者更糟的是默默地覆盖您的任务(如果您遵循 Windows 的命名约定 (VolumeShadowCopy{$GUID}))。

您需要做的是通过 GUI 创建一个(最好在 Win7/Win2008 上,因为较新版本的 Windows 默认使用 taskxml 1.2,而不是更兼容的 taskxml 1.1),通过 schtasks 将任务导出为 XML,以编程方式编辑该 XML,将该 XML 保存为 UTF16,然后导入它。幸运的是,一旦您一开始就通过了 GUI,这一切都可以在命令行上完成。

我想发布代码,但我写的代码是专有的,而且我没有得到雇主的许可。我希望 XML 提示至少能为您节省大量时间。我刚刚在数百台托管服务器上部署了 XML 解决方案,取得了巨大的成功。

相关内容