Як увімкнути тіньову копію за допомогою Powershell?


13

Як увімкнути тіньову копію на певному диску (D :, E:, ...) та налаштувати графік за допомогою Powershell?

Мені просто потрібні підказки, як почати.


1
Тут нам потрібна додаткова інформація. Яку ОС ви використовуєте? Яку програму ви використовуєте для створення резервних копій?
Холокриптик

Win XP і win 7. І я маю на увазі VSS, який є частиною win OS.
Primoz

Відповіді:


7

Ви можете створити копію Shadow на певному диску, використовуючи об’єкт WMI, як це пояснено в статті Microsoft .

Увімкнути тіньову копію на певному диску (D :, E:, ...) - це дві речі

  1. Створення тіньової копії, як показано в попередній статті
  2. Створення планового завдання для створення тіньової копії

Приємно. Ця відповідь саме те, що мені було потрібно. Я не знав, що я повинен створити задані завдання.
Primoz

7

Мені знадобилося трохи часу, щоб спрацювати це (після виявлення простої помилки, що призвела до її відмови), і функція є неповною. Я хочу додати можливість ввімкнути це на віддаленому комп’ютері, що, ймовірно, доведеться робити через завдання, яке виконується один раз. Якщо хтось змінить це і додасть це, дайте мені знати!

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, він все ще відображається як відключений для цього диска. Але якщо ввімкнути це, нічого не зміниться! (LOL) Я здогадуюсь, що в реєстрі є щось, що потрібно також змінити.


1
+1 за відповідь з повним сценарієм!
Марк Хендерсон

Потрібно додати $ date = Get-Date та $ tskFolder = $ raspored.GetFolder ("\")
Jeow Li Huan

2
$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), я не зовсім впевнений, що використовувані прапори є оптимальними.


2

Простіший спосіб використання 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 - повторення завдання кожні х хвилин після спуску
  • / DU - тривалість завдання, яке потрібно повторити

ПРИМІТКА: Перемикач / TR ПОТРЕБУЄ пробіл в кінці, якщо його немає там, він замінює остаточну косу рису подвійною цитатою, внаслідок чого інтерфейс VSS не розпізнає завдання.


1

Це те, що я використовую в 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"
}

Я пропоную відступити ...
peterh - Поновіть Моніку

1

Shadow Copy насправді вмикається шляхом створення завдань, які викликають vssadmin.exe.

У PowerShell 3.0 є командлети, які дозволяють створювати завдання, але вони залежать від системних викликів, які не були реалізовані до Windows 8 / Windows Server 2012. Для цього потрібні наступні три командлети:

register-scheduledTask
new-scheduledtaskaction
new-scheduledtasktrigger

У попередніх версіях Windows ви будете обмежені у використанні schtasks.exe.

Однак - і тут ця відповідь відрізняється від інших - створення завдання Shadow Copy цими способами не є правильним способом вчинити, оскільки будь-які внесені вами зміни не відображатимуться в графічному інтерфейсі. Таким чином, непомітний користувач може не знати про те, що Shadow Copy увімкнено, що призводить до того, що вони вмикають другий примірник її, або ще гірше мовчки перезаписують ваше завдання (якщо ви дотримуєтесь конвенцій про іменування Windows (VolumeShadowCopy {$ GUID})).

Що вам потрібно зробити, це створити його через GUI (бажано на Win7 / Win2008, оскільки нові версії Windows за замовчуванням використовують taskxml 1.2 замість суміснішого завданняxml 1.1), експортувати це завдання як XML за допомогою schtasks, програматично редагувати цей XML , збережіть цей XML як UTF16 та імпортуйте його. На щастя, щойно ви пройдете повз GUI на початку, все це можна зробити в командному рядку.

Я хотів би розмістити код, але те, що я написав, є власником, і я не маю дозволу від свого роботодавця. Я сподіваюся, що порада XML, принаймні, заощадить вам незліченну кількість годин. Я просто розгорнув рішення XML на сотнях керованих серверів, з великим успіхом.


1

Дякуємо всім, що сприяли цій темі. Це було корисно і врятувало мені багато роботи. Наступний сценарій PowerShell був протестований на Windows Server 2008 R2.

Наступний приклад створює знімок кожні 2 год. Між Mo.-Fr. з 08: 00h-18: 00h на томі 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</DisallowStartIfOnBatteries>
    <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%"

0

Найкраще, що я можу зробити, це вказати на вас тут , і конкретно вказати на цьому та на цьому .

Ні одна адреса точно не шукає, але я зазначу, що ви можете створювати тіньові копії в будь-якій точці, оскільки VSS є фоновою службою, яка працює до виклику.


0

Я отримав саме те, що мені потрібно з наступного коду, моя вимога полягала в налаштуванні VSS, але він також повинен бути видимим у графічному інтерфейсі. Ключова частина, щоб зробити його видимим у графічному інтерфейсі - це додати ідентифікатор тома до запланованого імені завдання, як вказував користувач261949 (це трохи дивно, чесно, я шукав ключ реєстру, але я не знайшов абсолютно нічого ..). Я закінчив наступний код, який відповідає моїм потребам:

#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'

Дякуємо всім за вашу корисну інформацію!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.