Powershell을 사용하여 볼륨 섀도 복사본을 활성화하는 방법은 무엇입니까?


13

특정 드라이브 (D :, E :, ...)에서 볼륨 섀도 복사본을 활성화하고 Powershell을 사용하여 일정을 설정하는 방법은 무엇입니까?

시작하는 방법에 대한 힌트가 필요합니다.


1
여기에 정보가 더 필요합니다. 어떤 OS를 사용하고 있습니까? 백업을 위해 어떤 프로그램을 사용하고 있습니까?
Holocryptic

XP를 승리하고 7을 승리하십시오. 그리고 저는 승리 OS의 일부인 VSS를 의미합니다.
Primoz

답변:


7

Microsoft Article에 설명 된대로 WMI 개체를 사용하여 특정 드라이브에 섀도 복사본을 만들 수 있습니다 .

특정 드라이브에서 볼륨 섀도 복사본 사용 (D :, E :, ...) 은 두 가지입니다.

  1. 이전 기사에 표시된대로 섀도 복사본 만들기
  2. 섀도 복사본을 만들기 위해 예약 된 작업 만들기

좋은. 이 대답은 내가 필요한 것입니다. 나는 sceduled 작업을 만들어야한다는 것을 몰랐습니다.
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하십시오!
Mark Henderson

$ date = Get-Date 및 $ 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"

그것을 엉망으로 만든 후에 약간 다르게 작동하게했습니다 (GUI를 통해 올바르게 표시되는 것처럼 보입니다).

약간의 도움이 필요하면이 페이지를 외우십시오 : https://social.technet.microsoft.com/forums/windowsserver/en-US/fb69840d-5f52-4711-8168-2faa23088233/shadow-copy-schedule-per-script

schtasks (페이지에서 사용하는 것)를 사용하는 단점은 내가 볼 수있는 한 여러 트리거를 가질 수 없다는 것입니다.

또한 솔루션 문제를 해결하는 방법 (작동하는 XML 작업 / 작동하지 않는 XML 사용)으로 인해 내가 사용하는 플래그가 최적이라는 것을 완전히 확신하지는 못합니다.


2

더 간단한 방법은 PowerShell 2와 호환되는 UI에 표시되는 schtasks를 사용하는 것을 의미합니다. 표준 빌드 용으로 설계되어 $ 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가 작업을 인식하지 못하도록합니다.


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-Reinstate Monica

1

섀도 복사본은 실제로 vssadmin.exe를 호출하는 작업을 만들어 활성화됩니다.

PowerShell 3.0에는 작업을 만들 수있는 cmdlet이 있지만 Windows 8 / Windows Server 2012까지 구현되지 않은 syscall에 따라 다릅니다. PowerShell 방식으로이 작업을 수행하려면 다음 세 가지 cmdlet이 필요합니다.

register-scheduledTask
new-scheduledtaskaction
new-scheduledtasktrigger

이전 버전의 Windows에서는 schtasks.exe 사용으로 제한됩니다.

그러나이 답변이 다른 답변과 다른 곳입니다. 이러한 방식으로 쉐도우 복사 작업을 생성하는 것은 올바른 방법이 아닙니다. 변경 사항은 GUI에 표시되지 않기 때문입니다. 따라서 관찰자가 아닌 사용자는 섀도 복사본이 활성화되었음을 알지 못하여 두 번째 인스턴스를 활성화하거나 작업을 자동으로 덮어 쓰는 경우가 더 나빠질 수 있습니다 (Windows의 명명 규칙 (VolumeShadowCopy {$ GUID})).

당신이해야 할 일은 GUI를 통해 하나를 생성하는 것입니다 (Win7 / Win2008에서는 최신 버전의 Windows가 더 호환되는 taskxml 1.1 대신 기본적으로 taskxml 1.2를 사용하므로), schtasks를 통해 XML로 작업을 내보내고 프로그래밍 방식으로 해당 XML을 편집하십시오 XML을 UTF16으로 저장하고 가져옵니다. 고맙게도 일단 GUI를 시작하면 명령 행에서이 모든 작업을 수행 할 수 있습니다.

코드를 게시하고 싶지만 내가 작성한 것은 독점적이며 고용주의 허가가 없습니다. XML 팁이 최소한 시간을 절약하게되기를 바랍니다. 방금 수백 개의 관리 서버에 XML 솔루션을 배포하여 큰 성공을 거두었습니다.


1

이 스레드에 기여한 모든 사람에게 감사합니다. 도움이되었고 많은 작업을 저축했습니다. 다음 PowerShell 스크립트는 Windows Server 2008 R2에서 테스트되었습니다.

다음 예는 Mo.-Fr 사이에서 2 시간마다 스냅 샷을 생성합니다. 볼륨 C의 08 : 00h-18 : 00h에서 :

일정을 수정하려면 인라인 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를 구성하는 것이었지만 GUI에서도 볼 수 있어야했습니다. GUI에서 볼 수있게하는 핵심 부분은 user261949가 지적한대로 예약 된 작업 이름에 볼륨 ID를 추가하는 것입니다. 내 요구에 맞는 다음 코드로 끝났습니다.

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

유용한 정보에 감사드립니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.