Вопрос или проблема
Как включить теневое копирование данных на определенный диск (D:, E:…) и настроить расписание с помощью PowerShell?
Мне просто нужны подсказки, с чего начать.
Вы можете создать теневую копию на определенном диске, используя объект WMI, как это объяснено в статье Microsoft.
Включение теневого копирования данных на определенном диске (D:, E:,…) состоит из двух частей
- Создание теневой копии, как показано в предыдущей статье
- Создание задачи по расписанию для создания теневой копии
Мне понадобилось некоторое время, чтобы заставить это работать (после того, как я обнаружил простую ошибку, вызывающую отказ), и функция неполная. Я хочу добавить возможность включения на удаленном компьютере, что, вероятно, нужно будет делать через задачу, которая запускается один раз. Если кто-то модифицирует это и добавит, дайте мне знать!
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);
}
Хотя это работает и имитирует то, что происходит, когда вы делаете это через интерфейс, все равно отображается как отключенное для этого диска. Но если вы включите его, ничего не изменится! (LOL) Я предполагаю, что нужно также изменить что-то в реестре.
$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 (что использует эта страница) является то, что, насколько я вижу, вы не можете иметь несколько триггеров.
Также из-за того, как я устранял проблему (использовал bindiff для xml), я не совсем уверен, что используемые мной флаги являются оптимальными.
Проще использовать schtasks, которые отображаются в интерфейсе, совместимые с PowerShell 2. Разработано для стандартной сборки, возможно, потребуется поэкспериментировать с $volumeinfo[x] при создании $taskrun, чтобы найти соответствующий том.
$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 "
Можете настроить следующие аргументы соответствующим образом:
- /SC – частота выполнения задачи
- /ST – время выполнения задачи
- /RI – повторение задачи каждые x минут после срабатывания триггера
- /DU – длительность задачи для повторения
ЗАМЕТКА: Параметр /TR ТРЕБУЕТ пробела в конце, если его нет, последний обратный слэш заменяется на двойную кавычку, из-за чего VSS UI не распознает задачу.
Теневое копирование на самом деле включается созданием задач, вызывающих vssadmin.exe.
PowerShell 3.0 содержит команды, которые позволяют создавать задачи, но они зависят от системных вызовов, которые не были реализованы до Windows 8 / Windows Server 2012.
Вам понадобятся следующие три команды, чтобы сделать это с помощью PowerShell:
register-scheduledTask
new-scheduledtaskaction
new-scheduledtasktrigger
В более ранних версиях Windows вы будете ограничены использованием schtasks.exe.
Однако — и в этом ответ отличается от других — создание задачи теневого копирования таким образом неправильно, так как любые изменения, которые вы сделаете, не отобразятся в GUI. Таким образом, невнимательный пользователь может не догадываться, что теневое копирование включено, что приведет к возможности включения второго экземпляра или, что еще хуже, к тихой перезаписи вашей задачи (если вы следовали конвенциям именования Windows (VolumeShadowCopy{$GUID})).
Что вам нужно сделать, так это создать задачу через GUI (предпочтительно на Win7/Win2008, так как более новые версии Windows используют taskxml 1.2 по умолчанию, а не более совместимый taskxml 1.1), экспортировать задачу как XML через schtasks, программно отредактировать этот XML, сохранить этот XML в формате UTF16 и импортировать его. К счастью, после получения GUI в начале, это всё можно сделать через командную строку.
Я бы хотел опубликовать код, но то, что я написал, является частной собственностью, и у меня нет разрешения от моего работодателя. Надеюсь, что подсказка с XML по крайней мере сэкономит вам бесчисленные часы. Я только что развернул решение с использованием XML на сотнях управляемых серверов с большим успехом.
Это то, чем я пользуюсь в 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"
}
Благодарю всех, кто принимал участие в этом обсуждении. Это было полезно и сэкономило мне много работы. Следующий PowerShell-скрипт был протестирован на Windows Server 2008 R2.
Следующий пример создает снимок каждые 2 часа с понедельника по пятницу с 08:00 до 18:00 на диске C:
Если вы хотите изменить расписание, просто отредактируйте или замените встроенные XML-данные.
Внимание: Нет гарантии. Нет ответственности. Пожалуйста, протестируйте в собственной лаборатории перед использованием в производственной среде.
# German Keyboard-Layout for Console Output. Can be skipped in english enviroments
#chcp 1252 >$null 2>&1
function ConfigureVolumeShadowCopies([string] $diskname, $vssMaxSizeInPercent) {
$xmlDocument = [xml] "<?xml version='1.0' encoding='UTF-16'?>
<Task version='1.1' xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Author>Administrator</Author>
</RegistrationInfo>
<Triggers>
<CalendarTrigger>
<StartBoundary>2018-01-01T08:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByWeek>
<DaysOfWeek>
<Monday />
<Tuesday />
<Wednesday />
<Thursday />
<Friday />
</DaysOfWeek>
<WeeksInterval>1</WeeksInterval>
</ScheduleByWeek>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2018-01-01T10:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByWeek>
<DaysOfWeek>
<Monday />
<Tuesday />
<Wednesday />
<Thursday />
<Friday />
</DaysOfWeek>
<WeeksInterval>1</WeeksInterval>
</ScheduleByWeek>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2018-01-01T12:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByWeek>
<DaysOfWeek>
<Monday />
<Tuesday />
<Wednesday />
<Thursday />
<Friday />
</DaysOfWeek>
<WeeksInterval>1</WeeksInterval>
</ScheduleByWeek>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2018-01-01T14:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByWeek>
<DaysOfWeek>
<Monday />
<Tuesday />
<Wednesday />
<Thursday />
<Friday />
</DaysOfWeek>
<WeeksInterval>1</WeeksInterval>
</ScheduleByWeek>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2018-01-01T16:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByWeek>
<DaysOfWeek>
<Monday />
<Tuesday />
<Wednesday />
<Thursday />
<Friday />
</DaysOfWeek>
<WeeksInterval>1</WeeksInterval>
</ScheduleByWeek>
</CalendarTrigger>
<CalendarTrigger>
<StartBoundary>2018-01-01T18:00:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByWeek>
<DaysOfWeek>
<Monday />
<Tuesday />
<Wednesday />
<Thursday />
<Friday />
</DaysOfWeek>
<WeeksInterval>1</WeeksInterval>
</ScheduleByWeek>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id='Author'>
<UserId>S-1-5-18</UserId>
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Settings>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnБatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<IdleSettings>
<Duration>PT600S</Duration>
<WaitTimeout>PT3600S</WaitTimeout>
<StopOnIdleEnd>false</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT259200S</ExecutionTimeLimit>
<Priority>5</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>C:\Windows\system32\vssadmin.exe</Command>
<Arguments>Create Shadow /AutoRetry=15 /For=\\?\Volume{REPLACEME}\</Arguments>
<WorkingDirectory>%systemroot%\system32</WorkingDirectory>
</Exec>
</Actions>
</Task>"
# Query Volume GUID of the given Volume
$VolumeWmi = gwmi Win32_Volume -Namespace root/cimv2 | ?{ $_.Name -eq ($diskname +"\") }
# Build Variables
$DeviceID = $VolumeWmi.DeviceID.ToUpper().Replace("\\?\VOLUME", "").Replace("\","")
$TaskName = "ShadowCopyVolume" + $DeviceID
$TaskFor = "\\?\Volume" + $DeviceID + "\"
# Replace Volume GUID in XML-Data
$xmlDocument.Task.Actions.Exec.Arguments = "Create Shadow /AutoRetry=15 /For=$TaskFor"
# Write temporary XML-File for Import of scheduled Task with schtask
$xmlDocumentFileName = $PSScriptRoot + "\" + $TaskName + ".xml"
$xmlDocument.Save($xmlDocumentFileName)
# Try to Delete existing Task for VSS
try {
schtasks /delete /TN $Taskname /f
}
catch {
#If Task can not be found: do nothing
}
# Create Scheduled Task
schtasks /Create /XML $xmlDocumentFileName /TN $TaskName
# Create (First) Snapshot
vssadmin Create Shadow /For=$diskname /AutoRetry=15
# Define Max Size of VSS Shadow Storage
vssadmin resize shadowstorage /For=$diskname /On=$diskname /MaxSize=$vssMaxSizeInPercent
# Delete temporary XML Document
Remove-Item $xmlDocumentFileName -Force
}
# Start Configuration - for Example on Volume C: with 10% MaxSize
ConfigureVolumeShadowCopies "C:" "10%"
Лучшее, что я могу сделать, это указать вам сюда, и особенно указать на этот и этот.
Ни один из них не касается точно того, что вы ищете, но я отмечу, что вы можете создавать теневые копии в любой момент, так как VSS — это фоновая служба, которая работает до вызова.
Я получил именно то, что мне нужно, с помощью следующего кода, мое требование заключалось в настройке VSS, но также он должен был быть видим в GUI. Ключевой частью для его видимости в GUI является добавление идентификатора тома в имя запланированной задачи, как указал user261949 (это немного странно, честно говоря, я искал в реестре, но не нашел абсолютно ничего..). Я закончил с следующим кодом, который удовлетворяет мои нужды:
#Enable Volume Shadow copy
#Enable Shadows
vssadmin add shadowstorage /for=C: /on=C: /maxsize=8128MB
#Create Shadows
vssadmin create shadow /for=C:
#create scheduled tasks
$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 07:00
$ScheduledTrigger += New-ScheduledTaskTrigger -Daily -At 12: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'
Спасибо всем за вашу полезную информацию!
Это самый простой способ включить теневые копии через PowerShell, он работает в Windows 10
Enable-ComputerRestore -Drive "C:\"
vssadmin resize shadowstorage /for=C: /on=C: /maxsize=10%
#Set Shadow Copy Scheduled Task for C: 6AM
$Action=New-ScheduledTaskAction powershell.exe (Get-WmiObject -List win32_shadowcopy).create("C:\","ClientAccessible")
$Principal=New-ScheduledTaskPrincipal -UserID "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$Trigger=New-ScheduledTaskTrigger -Daily -At 6:00AM
Register-ScheduledTask -TaskName ShadowCopyC_6AM -Trigger $Trigger -Action $Action -Principal $Principal -Description "ShadowCopyC_6AM"
#Set Shadow Copy Scheduled Task for C: 6PM
$Action=New-ScheduledTaskAction powershell.exe (Get-WmiObject -List win32_shadowcopy).create("C:\","ClientAccessible")
$Principal=New-ScheduledTaskPrincipal -UserID "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest
$Trigger=New-ScheduledTaskTrigger -Daily -At 6:00PM
Register-ScheduledTask -TaskName ShadowCopyC_6PM -Trigger $Trigger -Action $Action -Principal $Principal -Description "ShadowCopyC_6PM"
@Echo off @CHCP 1251 > nul
setlocal enabledelayedexpansion
goto STEP ОПИСАНИЕ (отказ от WMIC и переход на PowerShell)
- сканируем систему на предмет нахождения всех разделов всех локальных жестких дисков, на которых будем делать теневое копирование
- в зависимости от размеров раздела диска назначаю максимальный объем диска, отводимый под создание теневых копий по-умолчанию под теневые копии отвожу 20% объема диска, если эти 20% превышают объем 70Гб, делаю объем под теневые копии не 20%, а 70Гб если уже есть назначенные квоты на объем теневых копий – они будут переназначены по приведенному принципу
- включаю теневые копии на всех найденных разделах всех локальных жестких дисков
- генерирую скрипт по созданию теневых копий на разделах, который потом будет исполняться по расписанию от имени системы
- создаю задание в планировщике, которое будет делать теневые копии с помощью сгенерированного скрипта дважды в течение рабочего дня утром в 10:30 и через 5 часов в 15:30 :STEP
rem задаем имя и месторасположение скрипта создания теневых копий set ShadowCopyFILE=d:\ShadowCopyDISKs.cmd rem задаем максимальный объем для теневых копий в процентах от объема раздела диска set /a ShadowSpacePERCENT=20 rem задаем максимальный объем для теневых копий в гигабайтах от объема раздела диска set /a ShadowSpaceGIGABYTE=70
rem персоздаем скрипт создания теневых копий при каждом запуске erase %ShadowCopyFILE%
FOR /F “skip=3 tokens=1,7,10 delims=. ” %%i in (‘powershell Get-Volume’) do ( set DiskLETTER=%%i set /a FreeSPACE=%%j set /a DiskSIZE=%%k IF !DiskSIZE! GTR 0 ( set /a ShadowSPACE=!DiskSIZE!/100*%ShadowSpacePERCENT% IF !ShadowSPACE! GEQ %ShadowSpaceGIGABYTE% set /a ShadowSPACE=%ShadowSpaceGIGABYTE%
vssadmin resize shadowstorage /For=!DiskLETTER!: /On=!DiskLETTER!: /Maxsize=!ShadowSPACE!GB set EnableDISKs=!DiskLETTER!:,!EnableDISKs! rem вариант1, основанный на WMIC всё еще работает, но уже устарел, rem ибо в последних версиях винды11 WMIC уже не установлен, а в дальнейшем вообще вроде как будет удален rem echo wmic shadowcopy call create Volume=!DiskLETTER!:\ >> %ShadowCopyFILE% rem вариант2, основанный на PowerShell (основной) echo PowerShell (gwmi -list win32_shadowcopy^).Create(‘!DiskLETTER!:’,’ClientAccessible’^) >> %ShadowCopyFILE% )
rem включаем теневые копии на всех найденных разделах всех локальных жеских дисков компа PowerShell Enable-ComputerRestore -Drive %EnableDISKs:~0,-4%
rem создаем задание в планировщике schtasks /create /RU “SYSTEM” /TN “#REZ.ShadowCopyDISKs” /TR %ShadowCopyFILE% /SC DAILY /ST 10:30 /RI 300 /DU 12:00 /F
.
Ответ или решение
Для включения теневого копирования на определенных дисках (например, D:, E: и так далее) с использованием PowerShell, нужно выполнить несколько шагов. В этом ответе подробно описаны все необходимые действия для достижения данной задачи, включая создание задачи по расписанию для автоматизированного создания теневых копий.
Шаг 1: Настройка объема для теневого копирования
Первое, что необходимо сделать, это настроить объем теневого копирования на нужном диске. Ниже приведен пример команды PowerShell, которая позволяет установить максимальный размер хранения теневых копий на 10% объема диска:
vssadmin add shadowstorage /for=D: /on=D: /maxsize=10%
Здесь D:
— это диск, на котором вы хотите включить теневое копирование, и 10% — это максимальный размер пространства, который будет использоваться для хранения теневых копий.
Шаг 2: Создание задачи для автоматизации
Теперь, для автоматического создания теневых копий по расписанию, создадим задачу в Планировщике задач Windows. Это можно сделать при помощи PowerShell и vssadmin
. Пример кода для назначения задачи с помощью PowerShell представлен ниже:
# Путь к исполняемому файлу vssadmin
$Task = "C:\Windows\system32\vssadmin.exe"
# Параметры для создания теневой копии
$Arguments = "Create Shadow /AutoRetry=15 /For=D:"
# Каталог работы
$WorkingDirectory = "%systemroot%\system32"
# Определение действия задачи
$ScheduledAction = New-ScheduledTaskAction -Execute $Task -WorkingDirectory $WorkingDirectory -Argument $Arguments
# Определение триггеров задачи - 2 раза в день в 07:00 и 12:00
$ScheduledTrigger = @()
$ScheduledTrigger += New-ScheduledTaskTrigger -Daily -At 07:00
$ScheduledTrigger += New-ScheduledTaskTrigger -Daily -At 12:00
# Определение настроек задачи
$ScheduledSettings = New-ScheduledTaskSettingsSet -Compatibility V1 -DontStopOnIdleEnd -ExecutionTimeLimit (New-TimeSpan -Days 3) -Priority 5
# Создание и регистрация задачи
$TaskName = "ShadowCopyD"
Register-ScheduledTask $TaskName -Action $ScheduledAction -Trigger $ScheduledTrigger -Settings $ScheduledSettings -User 'NT AUTHORITY\SYSTEM'
Шаг 3: Объединение всех шагов в скрипт
Ниже приведен полный пример скрипта PowerShell, который объединяет все необходимые шаги для создания и планирования теневого копирования:
function Enable-ShadowCopies {
param(
[Parameter(Mandatory=$true)]
[String]$Drive
)
# Настройка объемов для теневых копий
vssadmin add shadowstorage /for=$Drive /on=$Drive /maxsize=10%
# Создание теневой копии
vssadmin create shadow /for=$Drive
# Создание запланированных задач для теневого копирования
$Task = "C:\Windows\system32\vssadmin.exe"
$Arguments = "Create Shadow /AutoRetry=15 /For=$Drive"
$WorkingDirectory = "%systemroot%\system32"
$ScheduledAction = New-ScheduledTaskAction -Execute $Task -WorkingDirectory $WorkingDirectory -Argument $Arguments
$ScheduledTrigger = @()
$ScheduledTrigger += New-ScheduledTaskTrigger -Daily -At 07:00
$ScheduledTrigger += New-ScheduledTaskTrigger -Daily -At 12:00
$ScheduledSettings = New-ScheduledTaskSettingsSet -Compatibility V1 -DontStopOnIdleEnd -ExecutionTimeLimit (New-TimeSpan -Days 3) -Priority 5
$TaskName = "ShadowCopyVolume" + $Drive.Replace(":", "").Replace("\", "")
Register-ScheduledTask $TaskName -Action $ScheduledAction -Trigger $ScheduledTrigger -Settings $ScheduledSettings -User 'NT AUTHORITY\SYSTEM'
}
# Пример вызова функции для диска D:
Enable-ShadowCopies -Drive "D:"
Этот скрипт автоматизирует настройку и поддержку теневого копирования на заданном диске, и все изменения будут видимы в графическом интерфейсе, что важно для управления через пользовательские интерфейсы.