Bagaimana cara mengaktifkan salinan bayangan volume menggunakan Powershell?


13

Bagaimana cara mengaktifkan salinan bayangan volume pada drive tertentu (D :, E:, ...) dan mengatur jadwal menggunakan Powershell?

Saya hanya perlu beberapa petunjuk bagaimana memulai.


1
Kami memerlukan informasi lebih lanjut di sini. OS apa yang Anda gunakan? Program mana yang Anda gunakan untuk melakukan backup?
Holocryptic

Menangkan XP dan menang 7. Dan maksud saya VSS, yang merupakan bagian dari win OS.
Primoz

Jawaban:


7

Anda dapat membuat salinan Shadow di drive tertentu menggunakan objek WMI seperti yang dijelaskan di Artikel Microsoft .

Mengaktifkan salinan bayangan volume pada drive tertentu (D :, E:, ...) adalah dua hal

  1. Membuat salinan bayangan seperti yang ditunjukkan pada artikel sebelumnya
  2. Membuat tugas terjadwal untuk membuat salinan bayangan

Bagus. Jawaban inilah yang saya butuhkan. Saya tidak tahu bahwa saya harus membuat tugas berjadwal.
Primoz

7

Butuh beberapa saat untuk menjalankannya (setelah menemukan kesalahan sederhana yang menyebabkannya gagal), dan fungsinya tidak lengkap. Saya ingin menambahkan kemampuan untuk mengaktifkannya di komputer jarak jauh, yang mungkin harus dilakukan melalui tugas yang dijalankan sekali. Jika ada yang memodifikasi ini dan menambahkannya, beri tahu saya!

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);
}

Meskipun ini berfungsi, dan ini meniru apa yang terjadi ketika Anda melakukannya melalui GUI, itu masih terlihat dinonaktifkan untuk drive itu. Tetapi jika Anda mengaktifkannya, tidak ada yang berubah! (LOL) Saya menduga ada sesuatu yang perlu juga dimodifikasi dalam registri.


1
+1 untuk menjawab dengan skrip lengkap!
Mark Henderson

Perlu menambahkan $ date = Dapatkan-Tanggal dan $ tskFolder = $ scheduler.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"

Setelah banyak mengacaukannya, membuatnya bekerja sedikit berbeda (juga terlihat muncul dengan baik melalui GUI).

Berteriak ke halaman ini untuk sedikit bantuan: https://social.technet.microsoft.com/forums/windowsserver/en-US/fb69840d-5f52-4711-8168-2faa23088233/shadow-copy-schedule-per-script

Kelemahan dari menggunakan schtasks (apa yang digunakan halaman itu) adalah bahwa Anda tidak dapat memiliki banyak pemicu sejauh yang saya bisa lihat.

Juga karena cara saya memecahkan masalah solusi (Digunakan bindiff berfungsi / tidak bekerja xml), saya tidak sepenuhnya yakin bahwa flag yang saya gunakan optimal.


2

Simpler berarti menggunakan schtasks yang ditampilkan di UI, kompatibel di PowerShell 2. Dirancang untuk build standar, mungkin perlu bermain-main dengan $ volumeinfo [x] saat membuat $ taskrun untuk menemukan volume yang sesuai.

$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 "

Dapat mengkonfigurasi argumen berikut dengan tepat:

  • / SC - tugas frekuensi dipicu
  • / ST - tugas waktu dipicu
  • / RI - pengulangan tugas setiap x menit setelah pemicu
  • / DU - durasi tugas yang harus diulang

CATATAN: Sakelar / TR MEMBUTUHKAN ruang di bagian akhir, jika tidak ada di sana, ia mengganti backslash akhir dengan tanda kutip ganda yang menyebabkan VSS UI tidak mengenali tugas tersebut.


1

Inilah yang saya gunakan di PowerShell . Ini tautan ke situs saya, tetapi terlihat jauh lebih baik daripada yang ditempelkan di sini.

#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"
}

Saya sarankan untuk indent ...
peterh - Reinstate Monica

1

Shadow Copy sebenarnya diaktifkan dengan membuat tugas yang memanggil vssadmin.exe.

PowerShell 3.0 memiliki cmdlet yang memungkinkan Anda untuk membuat tugas, tetapi ini tergantung pada syscall yang tidak diimplementasikan hingga Windows 8 / Windows Server 2012. Anda perlu tiga cmdlet berikut untuk melakukan ini dengan cara PowerShell:

register-scheduledTask
new-scheduledtaskaction
new-scheduledtasktrigger

Di versi Windows yang lebih lama, Anda akan dibatasi untuk menggunakan schtasks.exe.

Namun - dan di sinilah jawaban ini berbeda dari yang lain - membuat tugas Salin Bayangan dengan cara ini bukan cara yang tepat untuk melakukan sesuatu, karena setiap perubahan yang Anda buat tidak akan muncul di GUI. Dengan demikian, pengguna yang tidak patuh mungkin tidak menyadari bahwa Shadow Copy telah diaktifkan, sehingga mengakibatkan mereka mengaktifkan instance kedua, atau lebih buruk menimpa tugas Anda secara diam-diam (jika Anda mengikuti konvensi penamaan Windows (VolumeShadowCopy {$ GUID})).

Apa yang perlu Anda lakukan, adalah membuat satu melalui GUI (lebih disukai pada Win7 / Win2008, karena versi Windows yang lebih baru menggunakan taskxml 1.2 secara default alih-alih taskxml 1.1 yang lebih kompatibel), ekspor tugas sebagai XML melalui schtasks, secara terprogram mengedit XML itu , simpan XML itu sebagai UTF16, dan imporlah. Untungnya, setelah Anda melewati GUI di awal, ini semua bisa dilakukan di commandline.

Saya ingin memposting kode, tetapi apa yang saya tulis adalah hak milik, dan saya tidak memiliki izin dari majikan saya. Saya berharap bahwa ujung XML akan, paling tidak, menghemat banyak waktu Anda. Saya baru saja menggunakan solusi XML di ratusan server yang dikelola, untuk sukses besar.


1

Terima kasih kepada semua orang, yang berkontribusi pada utas ini. Itu membantu dan menyelamatkan saya banyak pekerjaan. Skrip PowerShell berikut ini diuji pada Windows Server 2008 R2.

Contoh berikut membuat Foto setiap 2 jam antara Mo.-Fr. dari pukul 08: 00-18: 00 pada Volume C:

Jika Anda ingin mengubah jadwal, cukup edit atau ganti inline XML-Data.

Perhatian: Tidak ada garansi. Tidak bertanggung jawab. Silakan uji di lab Anda sendiri sebelum digunakan dalam lingkungan produksi.

# 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

Yang terbaik yang bisa saya lakukan adalah mengarahkan Anda ke sini , dan secara khusus tunjukkan yang ini dan yang ini .

Baik alamat apa yang Anda cari, tapi saya akan menunjukkan Anda dapat membuat salinan bayangan di titik mana pun karena VSS adalah layanan latar belakang yang berjalan sampai dipanggil.


0

Saya mendapatkan apa yang saya butuhkan dengan kode berikut, persyaratan saya adalah untuk mengkonfigurasi VSS tetapi juga perlu terlihat di GUI. Bagian kunci untuk membuatnya terlihat dalam GUI adalah menambahkan ID volume dalam nama tugas yang dijadwalkan seperti yang ditunjukkan oleh user261949 (itu agak aneh, jujur ​​saya sedang mencari kunci registri tetapi saya sama sekali tidak menemukan apa-apa ..). Saya berakhir dengan kode berikut yang sesuai dengan kebutuhan saya:

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

Terima kasih semua atas informasi bermanfaat Anda!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.