如何使用Powershell启用卷影副本?

如何启用特定驱动器上的卷影副本(D:,E:,…),并使用Powershell设置时间表?

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

您可以使用WMI对象在特定的驱动器上创build一个“影子”副本,如Microsoft文章中所述 。

在特定驱动器(D:,E:,…)上启用卷影副本是两件事情

  1. 创build一个影子副本,如前面的文章所示
  2. 创build计划任务以创build卷影副本

我花了一点时间才得到这个工作(find简单的错误导致它失败),并且function是不完整的。 我想添加在远程计算机上启用它的function,这可能需要通过一次运行的任务来完成。 如果有人修改这个,并补充说,让我知道!

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来模仿发生什么,它仍然显示为禁用该驱动器。 但是,如果你启用它,什么都不会改变! (大声笑)我猜有些东西,需要在registry中修改。

 $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),我不完全相信,我使用的标志是最佳的。

更简单的方法是使用在UI中显示的schtasks,与PowerShell 2兼容。为标准构build而devise,在创build$ taskrun来查找适当的卷时可能需要使用$ volumeinfo [x]。

 $volumeinfo = GWMI -namespace root\cimv2 -class win32_volume $volumeid = $volumeinfo[1].deviceid $taskname = "ShadowCopyVolume" + $volumeid.replace("\","").replace("?Volume","") $taskrun = "C:\Windows\system32\vssadmin.exe Create Shadow /AutoRetry=15 /For=$volumeid" schtasks /create /RU SYSTEM /SC DAILY /ST 07:00 /RI 60 /DU 12:00 /K /V1 /TN $TaskName /TR "$taskrun " 

可以适当地configuration下列参数:

  • / SC – 频率任务被触发
  • / ST – 时间任务被触发
  • / RI – 触发后每x分钟重复一次任务
  • / DU – 要重复的任务的持续时间

注意:/ TR开关要求最后的空格,如果不是,则用双引号replace最后一个反斜杠,导致VSS UI无法识别任务。

我能做的最好的是指出你在这里 ,特别指出这一个和这一个 。

既不能解决你正在寻找什么,但我会指出你可以在任何时候创build卷影副本,因为VSS是一个后台服务,直到被调用。

这是我在PowerShell中使用的 。 它是一个链接到我的网站,但它看起来比它粘贴在这里好很多。

 #Enable Volume Shadow copy clear $Continue = Read-Host "Enable Volume Shadowcopy (Y/N)?" while("Y","N" -notcontains $Continue) { $Continue = Read-Host "Enable Volume Shadowcopy (Y/N)?" } if ($Continue -eq "Y") { #Enable Shadows vssadmin add shadowstorage /for=C: /on=C: /maxsize=8128MB vssadmin add shadowstorage /for=D: /on=D: /maxsize=8128MB #Create Shadows vssadmin create shadow /for=C: vssadmin create shadow /for=D: #Set Shadow Copy Scheduled Task for C: AM $Action=new-scheduledtaskaction -execute "c:\windows\system32\vssadmin.exe" -Argument "create shadow /for=C:" $Trigger=new-scheduledtasktrigger -daily -at 6:00AM Register-ScheduledTask -TaskName ShadowCopyC_AM -Trigger $Trigger -Action $Action -Description "ShadowCopyC_AM" #Set Shadow Copy Scheduled Task for C: PM $Action=new-scheduledtaskaction -execute "c:\windows\system32\vssadmin.exe" -Argument "create shadow /for=C:" $Trigger=new-scheduledtasktrigger -daily -at 6:00PM Register-ScheduledTask -TaskName ShadowCopyC_PM -Trigger $Trigger -Action $Action -Description "ShadowCopyC_PM" #Set Shadow Copy Scheduled Task for D: AM $Action=new-scheduledtaskaction -execute "c:\windows\system32\vssadmin.exe" -Argument "create shadow /for=D:" $Trigger=new-scheduledtasktrigger -daily -at 7:00AM Register-ScheduledTask -TaskName ShadowCopyD_AM -Trigger $Trigger -Action $Action -Description "ShadowCopyD_AM" #Set Shadow Copy Scheduled Task for D: PM $Action=new-scheduledtaskaction -execute "c:\windows\system32\vssadmin.exe" -Argument "create shadow /for=D:" $Trigger=new-scheduledtasktrigger -daily -at 7:00PM Register-ScheduledTask -TaskName ShadowCopyD_PM -Trigger $Trigger -Action $Action -Description "ShadowCopyD_PM" }