Wie aktiviere ich Volume Shadow Copy mit Powershell?


13

Wie aktiviere ich Volume Shadow Copy auf einem bestimmten Laufwerk (D :, E:, ...) und richte einen Zeitplan mit Powershell ein?

Ich brauche nur ein paar Hinweise, wie ich anfangen soll.


1
Wir brauchen hier weitere Informationen. Welches Betriebssystem verwenden Sie? Mit welchem ​​Programm machen Sie Backups?
Holocryptic

Win XP und Win 7. Und ich meine VSS, das Teil von Win OS ist.
Primoz

Antworten:


7

Sie können eine Schattenkopie auf einem bestimmten Laufwerk mithilfe eines WMI-Objekts erstellen, wie im Microsoft-Artikel erläutert .

Das Aktivieren der Volumeschattenkopie auf einem bestimmten Laufwerk (D :, E:, ...) ist zweierlei

  1. Erstellen einer Schattenkopie wie im vorherigen Artikel gezeigt
  2. Erstellen einer geplanten Aufgabe zum Erstellen einer Schattenkopie

Nett. Diese Antwort ist genau das, was ich brauchte. Ich wusste nicht, dass ich eine geplante Aufgabe erstellen muss.
Primoz

7

Es dauerte eine Weile, bis dies funktionierte (nachdem ich den einfachen Fehler gefunden hatte, der zum Fehlschlagen führte), und die Funktion ist unvollständig. Ich möchte die Möglichkeit hinzufügen, es auf einem Remotecomputer zu aktivieren, was wahrscheinlich über eine Aufgabe erfolgen muss, die einmal ausgeführt wird. Wenn jemand dies ändert und das hinzufügt, lass es mich wissen!

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

Obwohl dies funktioniert und nachahmt, was passiert, wenn Sie es über die GUI tun, wird es für dieses Laufwerk weiterhin als deaktiviert angezeigt. Aber wenn Sie es aktivieren, ändert sich nichts! (LOL) Ich vermute, es gibt etwas, das auch in der Registrierung geändert werden muss.


1
+1 für die Beantwortung mit einem vollständigen Skript!
Mark Henderson

Es müssen $ date = Get-Date und $ tskFolder = $ scheduler.GetFolder ("\")
hinzugefügt werden

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"

Nachdem ich ein paar Mal damit rumgespielt hatte, funktionierte es etwas anders (es scheint auch über die GUI richtig zu erscheinen).

Shoutouts zu dieser Seite für ein bisschen Hilfe: https://social.technet.microsoft.com/forums/windowsserver/en-US/fb69840d-5f52-4711-8168-2faa23088233/shadow-copy-schedule-per-script

Der Nachteil bei der Verwendung von schtasks (was diese Seite verwendet) ist, dass Sie, soweit ich sehen kann, nicht mehrere Trigger haben können.

Auch aufgrund der Art und Weise, wie ich Probleme mit der Lösung habe (ich habe ein Bindiff von working / not working xml verwendet), bin ich nicht ganz davon überzeugt, dass die von mir verwendeten Flags optimal sind.


2

Einfacher bedeutet, dass Sie die in PowerShell 2 kompatiblen Schtasks verwenden müssen, die in der Benutzeroberfläche angezeigt werden. Bei der Erstellung von $ taskrun müssen Sie möglicherweise mit $ volumeinfo [x] spielen, um das entsprechende Volume zu finden.

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

Kann die folgenden Argumente entsprechend konfigurieren:

  • / SC - Frequenztask wird ausgelöst
  • / ST - Zeitaufgabe wird ausgelöst
  • / RI - Wiederholung der Aufgabe alle x Minuten nach dem Auslösen
  • / DU - Dauer der zu wiederholenden Aufgabe

ANMERKUNG: Die Option / TR erfordert das Leerzeichen am Ende. Wenn sie nicht vorhanden ist, wird der letzte Backslash durch ein doppeltes Anführungszeichen ersetzt, wodurch die VSS-Benutzeroberfläche die Aufgabe nicht erkennt.


1

Dies ist, was ich in PowerShell verwende . Es ist ein Link zu meiner Seite, aber es sieht viel besser aus als hier eingefügt.

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

Ich schlage vor,
einzurücken

1

Die Schattenkopie wird tatsächlich aktiviert, indem Aufgaben erstellt werden, die vssadmin.exe aufrufen.

PowerShell 3.0 verfügt über Cmdlets, mit denen Sie Aufgaben erstellen können. Diese hängen jedoch von Systemaufrufen ab, die erst unter Windows 8 / Windows Server 2012 implementiert wurden. Sie benötigen die folgenden drei Cmdlets, um dies auf PowerShell-Weise auszuführen:

register-scheduledTask
new-scheduledtaskaction
new-scheduledtasktrigger

In früheren Windows-Versionen können Sie nur schtasks.exe verwenden.

Allerdings - und hier unterscheidet sich diese Antwort von den anderen - ist das Erstellen einer Schattenkopie-Aufgabe auf diese Weise nicht die richtige Vorgehensweise, da alle Änderungen, die Sie vornehmen, nicht in der GUI angezeigt werden. Aus diesem Grund ist einem nicht beobachtenden Benutzer möglicherweise nicht bekannt, dass die Schattenkopie aktiviert wurde, was dazu führt, dass er eine zweite Instanz davon aktiviert oder Ihre Aufgabe unbemerkt überschreibt (wenn Sie die Namenskonventionen von Windows befolgt haben (VolumeShadowCopy {$ GUID}).

Sie müssen eine über die GUI erstellen (vorzugsweise unter Win7 / Win2008, da neuere Windows-Versionen standardmäßig taskxml 1.2 anstelle der kompatibleren taskxml 1.1 verwenden), die Aufgabe als XML über schtasks exportieren und diese XML programmgesteuert bearbeiten Speichern Sie diese XML als UTF16 und importieren Sie sie. Zum Glück können Sie dies alles über die Befehlszeile erledigen, sobald Sie zu Beginn an der GUI vorbeigekommen sind.

Ich möchte eine Postleitzahl eingeben, aber das, was ich geschrieben habe, ist urheberrechtlich geschützt und ich habe keine Erlaubnis von meinem Arbeitgeber. Ich hoffe, dass der XML-Tipp Ihnen mindestens unzählige Stunden erspart. Ich habe die XML-Lösung gerade auf Hunderten von verwalteten Servern implementiert, und das mit großem Erfolg.


1

Vielen Dank an alle, die zu diesem Thread beigetragen haben. Es war hilfreich und hat mir viel Arbeit erspart. Das folgende PowerShell-Skript wurde unter Windows Server 2008 R2 getestet.

Das folgende Beispiel erstellt alle 2 Stunden einen Snapshot zwischen Mo.-Fr. von 08:00 bis 18:00 Uhr auf Band C:

Wenn Sie den Zeitplan ändern möchten, bearbeiten oder ersetzen Sie einfach die Inline-XML-Daten.

Achtung: Keine Gewährleistung. Keine Verantwortung. Bitte testen Sie es in Ihrem eigenen Labor, bevor Sie es in der Produktion einsetzen.

# 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

Das Beste, was ich tun kann, ist, Sie hierher zu führen und auf dieses und jenes hinzuweisen .

Keine der beiden Adressen ist genau das, wonach Sie suchen, aber ich möchte Sie darauf hinweisen, dass Sie jederzeit Schattenkopien erstellen können, da VSS ein Hintergrunddienst ist, der bis zum Aufruf ausgeführt wird.


0

Mit dem folgenden Code habe ich genau das bekommen, was ich brauchte. Meine Anforderung war, VSS zu konfigurieren, aber es musste auch in der GUI sichtbar sein. Das wichtigste Element, um es in der Benutzeroberfläche sichtbar zu machen, ist das Hinzufügen der Datenträger-ID zum Namen der geplanten Aufgabe, auf die der Benutzer 261949 hingewiesen hat (das ist etwas seltsam, ehrlich gesagt, ich habe nach einem Registrierungsschlüssel gesucht, aber absolut nichts gefunden.). Am Ende habe ich den folgenden Code erhalten, der meinen Anforderungen entspricht:

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

Vielen Dank für Ihre nützlichen Informationen!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.