Làm cách nào để bật bản sao bóng khối bằng Powershell?


13

Làm cách nào để bật bản sao bóng khối lượng trên ổ đĩa cụ thể (D:, E :, ...) và thiết lập lịch trình bằng Powershell?

Tôi chỉ cần một số gợi ý làm thế nào để bắt đầu.


1
Chúng tôi cần thêm một số thông tin ở đây. Bạn đang sử dụng hệ điều hành nào? Chương trình nào bạn đang sử dụng để thực hiện sao lưu?
Holocryptic

Win XP và win 7. Và ý tôi là VSS, một phần của hệ điều hành win.
Primoz

Câu trả lời:


7

Bạn có thể tạo một bản sao Shadow trên một ổ đĩa cụ thể bằng cách sử dụng đối tượng WMI như được giải thích trong Điều khoản của Microsoft .

Cho phép sao chép bóng khối lượng trên ổ đĩa cụ thể (D:, E :, ...) là hai điều

  1. Tạo một bản sao bóng như trong bài viết trước
  2. Tạo một tác vụ theo lịch trình để tạo bản sao bóng

Đẹp. Câu trả lời này chính xác là những gì tôi cần. Tôi không biết rằng tôi phải tạo ra nhiệm vụ.
Primoz

7

Tôi phải mất một chút thời gian để làm việc này (sau khi tìm thấy lỗi đơn giản khiến nó bị lỗi) và chức năng không đầy đủ. Tôi muốn thêm khả năng kích hoạt nó trên một máy tính từ xa, điều này có thể sẽ phải được thực hiện thông qua một tác vụ được chạy một lần. Nếu bất cứ ai sửa đổi điều này và thêm điều đó, cho tôi biết!

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

Mặc dù điều này hoạt động và nó bắt chước những gì xảy ra khi bạn thực hiện thông qua GUI, nhưng nó vẫn hiển thị là bị vô hiệu hóa cho ổ đĩa đó. Nhưng nếu bạn kích hoạt nó, không có gì thay đổi! (LOL) Tôi đoán có một cái gì đó cũng cần phải được sửa đổi trong sổ đăng ký.


1
+1 để trả lời với một kịch bản đầy đủ!
Mark Henderson

Cần thêm $ date = Get-Date và $ tskFolder = $ calendaruler.GetFolder ("\")
Jeow Li Huân

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"

Sau một loạt các mớ hỗn độn với nó, làm cho nó hoạt động hơi khác một chút (nó dường như cũng hiển thị đúng thông qua GUI).

Hét lên trang này để được giúp đỡ: https://social.technet.microsoft.com/forums/windowsserver/en-US/fb69840d-5f52-4711-8168-2faa23088233/shadow-copy-schedule-per-script

Nhược điểm của việc sử dụng scht task (những gì trang đó sử dụng) là bạn không thể có nhiều kích hoạt như tôi có thể thấy.

Ngoài ra do cách tôi khắc phục giải pháp (Đã sử dụng một ràng buộc làm việc / không hoạt động xml), tôi không hoàn toàn tin rằng các cờ tôi sử dụng là tối ưu.


2

Đơn giản hơn có nghĩa là sử dụng scht task hiển thị trong UI, tương thích trong PowerShell 2. Được thiết kế cho bản dựng tiêu chuẩn, có thể cần phải chơi với $ volumeinfo [x] khi tạo $ taskrun để tìm âm lượng phù hợp.

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

Có thể cấu hình các đối số sau một cách thích hợp:

  • / SC - tác vụ tần số được kích hoạt
  • / ST - nhiệm vụ thời gian được kích hoạt
  • / RI - lặp lại nhiệm vụ mỗi x phút sau khi kích hoạt
  • / DU - thời gian thực hiện nhiệm vụ được lặp lại

LƯU Ý: Công tắc / TR YÊU CẦU khoảng trống ở cuối, nếu không có nó, nó sẽ thay thế dấu gạch chéo cuối cùng bằng dấu ngoặc kép làm cho VSS UI không nhận ra tác vụ.


1

Đây là những gì tôi sử dụng trong PowerShell . Đó là một liên kết đến trang web của tôi, nhưng nó có vẻ tốt hơn nhiều so với nó được dán ở đây.

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

Tôi đề nghị thụt lề ...
peterh - Phục hồi Monica

1

Shadow Copy thực sự được kích hoạt bằng cách tạo các tác vụ gọi vssadmin.exe.

PowerShell 3.0 có các lệnh ghép ngắn cho phép bạn tạo các tác vụ, nhưng các lệnh này phụ thuộc vào các tòa nhà không được triển khai cho đến Windows 8 / Windows Server 2012. Bạn cần ba trong số các lệnh ghép ngắn sau để thực hiện theo cách này của PowerShell:

register-scheduledTask
new-scheduledtaskaction
new-scheduledtasktrigger

Trong các phiên bản trước của Windows, bạn sẽ bị hạn chế sử dụng scht task.exe.

Tuy nhiên - và đây là nơi câu trả lời này khác với các câu hỏi khác - tạo ra tác vụ Shadow Copy theo những cách này không phải là cách đúng đắn để thực hiện, vì mọi thay đổi bạn thực hiện sẽ không hiển thị trong GUI. Do đó, một người dùng không quan tâm có thể không biết rằng Shadow Copy đã được bật, do đó họ cho phép phiên bản thứ hai của nó hoặc tệ hơn là ghi đè lên nhiệm vụ của bạn (nếu bạn tuân theo các quy ước đặt tên của Windows (VolumeShadowCopy {$ GUID})).

Những gì bạn cần làm là tạo một cái qua GUI (tốt nhất là trên Win7 / Win2008, vì các phiên bản Windows mới hơn sử dụng taskxml 1.2 theo mặc định thay vì taskxml 1.1 tương thích hơn), xuất tác vụ dưới dạng XML thông qua scht task, lập trình chỉnh sửa XML đó , lưu XML đó dưới dạng UTF16 và nhập nó. Rất may, khi bạn vượt qua GUI lúc đầu, tất cả có thể được thực hiện trên dòng lệnh.

Tôi muốn đăng mã, nhưng những gì tôi viết là độc quyền và tôi không được phép của chủ nhân. Tôi hy vọng rằng mẹo XML ít nhất sẽ giúp bạn tiết kiệm vô số giờ. Tôi vừa triển khai giải pháp XML trên hàng trăm máy chủ được quản lý, để thành công lớn.


1

Cảm ơn tất cả mọi người, đã đóng góp cho chủ đề này. Nó rất hữu ích và giúp tôi tiết kiệm rất nhiều công việc. Tập lệnh PowerShell sau đây đã được thử nghiệm trên Windows Server 2008 R2.

Ví dụ sau đây tạo Ảnh chụp cứ sau 2 giờ giữa Mo.-Fr. từ 08: 00h-18: 00h trên Tập C:

Nếu bạn muốn sửa đổi lịch biểu, chỉ cần chỉnh sửa hoặc thay thế Dữ liệu XML nội tuyến.

Chú ý: Không bảo hành. Không có trách nhiệm. Vui lòng kiểm tra trong phòng thí nghiệm của riêng bạn trước khi sử dụng trong môi trường sản xuất.

# 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

Điều tốt nhất tôi có thể làm là chỉ cho bạn ở đây , và đặc biệt chỉ ra điều nàycái này .

Không giải quyết chính xác những gì bạn đang tìm kiếm, nhưng tôi sẽ chỉ ra rằng bạn có thể tạo bản sao bóng tại bất kỳ điểm nào vì VSS là dịch vụ nền chạy cho đến khi được gọi.


0

Tôi đã nhận được chính xác những gì tôi cần với đoạn mã sau, yêu cầu của tôi là cấu hình VSS nhưng cũng cần phải hiển thị trong GUI. Phần quan trọng để làm cho nó hiển thị trong GUI là thêm ID âm lượng trong tên tác vụ theo lịch trình như được chỉ định bởi user261949 (điều đó hơi lạ, thật lòng tôi đang tìm kiếm khóa đăng ký nhưng tôi hoàn toàn không tìm thấy gì ..). Tôi đã kết thúc với mã sau đây phù hợp với nhu cầu của tôi:

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

Cảm ơn tất cả các thông tin hữu ích của bạn!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.