web-dev-qa-db-fra.com

Comment activer le volume Copie Shadow à l'aide de PowerShell?

Comment activer le volume Copie Shadow sur un lecteur spécifique (D: E:, ...) et configurer le calendrier à l'aide de PowerShell?

J'ai juste besoin de conseils comment commencer.

13
Primoz

Vous pouvez créer une copie d'ombre sur un lecteur spécifique à l'aide d'un objet WMI comme celui-ci expliqué dans Article Microsoft .

Activez le volume Copie Shadow sur un lecteur spécifique (D: E:, ...) est deux choses

  1. Création d'une copie d'ombre comme indiqué dans l'article précédent
  2. Création d'une tâche planifiée pour créer une copie shadow
7
JPBlanc
$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"

Après tout tout un tas de messages avec elle, il est nécessaire de travailler légèrement différemment (il semble également apparaître correctement via l'interface graphique).

Shoutsouts à cette page pour un peu d'aide: https://social.technet.microsoft.com/forums/windowsserver/en-us/fb69840d-5f52-4711-8168-2faa23088233/shadow-copy-schedule- par script

L'inconvénient à utiliser SchTasks (ce que cette page utilise) est que vous ne pouvez pas avoir de déclencheurs multiples aussi loin que je peux voir.

En outre, à cause de la manière dont je résout la solution (utilisée un librictif de travail/ne fonctionne pas XML), je ne suis pas entièrement convaincu que les drapeaux que j'utilise sont optimaux.

2
user261949

Un moyen plus simple d'utiliser SchTasks qui apparaît dans l'interface utilisateur, compatible dans PowerShell 2. Conçu pour une construction standard, peut avoir besoin de jouer avec $ volumeinfo [x] lors de la création de $ TaskRun pour trouver le volume approprié.

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

Peut configurer les arguments suivants de manière appropriée:

  • / SC - La tâche de fréquence est déclenchée
  • / La tâche st-time est déclenchée
  • / RI - Répétition de la tâche toutes les x minutes après la gâchette
  • / Durée de la tâche à répéter

Remarque: le commutateur/TR nécessite l'espace à la fin, s'il n'en est pas là, il remplace la barre oblique inverse avec une double devis entraînant que l'interface utilisateur de VSS ne reconnaisse pas la tâche.

2
Deadly-Bagel

La copie de l'ombre est effectivement activée en créant des tâches qui appellent VSSADMIN.EXE.

PowerShell 3.0 a des cmdlets qui vous permettent de créer des tâches, mais ceux-ci dépendent des systèmes SysCalls qui n'étaient pas implémentés avant que Windows 8/Windows Server 2012. Vous avez besoin de trois de ces cmdlets suivants pour faire cela la voie PowerShell:

register-scheduledTask
new-scheduledtaskaction
new-scheduledtasktrigger

Dans les versions antérieures de Windows, vous serez limité à utiliser SchTasks.exe.

Toutefois - et c'est là que cette réponse diffère des autres - la création d'une tâche de copie de l'ombre de ces manières n'est pas la bonne façon de faire des choses, car toute modification que vous produise ne vous apparaîtra pas dans l'interface graphique. En tant que tel, un utilisateur désobservant peut ignorer que la copie ombreuse a été activée, ce qui les a permis d'entraîner une seconde instance de celui-ci, ou de pire silencieusement écraser votre tâche (si vous avez suivi les conventions de dénomination de Windows (VolumeShadowCopy {$ GUID})).

Ce que vous devez faire, est de créer une via l'interface graphique (de préférence sur Win7/Win2008, en tant que nouvelles versions de Windows utilisez TaskXML 1.2 par défaut au lieu de la tâche plus compatible XML 1.1), exportez la tâche comme XML via SchTasks, éditez de manière programmable que xml , enregistrez ce XML comme UTF16 et importer. Heureusement, une fois que vous avez dépassé l'interface graphique au début, cela peut tous être fait sur la ligne de commande.

Je voudrais poster du code, mais ce que j'ai écrit est exclusif et je n'ai pas la permission de mon employeur. J'espère que la pointe XML va, à tout le moins, vous sauverez d'innombrables heures. Je viens de déployer la solution XML sur des centaines de serveurs gérés, au grand succès.

1
Miles B Huff

Merci à tous, cela contribuait à ce fil. C'était utile et m'a sauvé beaucoup de travail. Le script PowerShell suivant a été testé sur Windows Server 2008 R2.

L'exemple suivant crée un instantané tous les 2h entre Mo.-fr. De 08h00h-18: 00h sur le volume C:

Si vous souhaitez modifier la planification, il suffit de modifier ou de remplacer les données XML en ligne.

Attention: aucune garantie. Pas de responsabilité. Veuillez tester votre propre laboratoire avant utilisation dans la production Enviroment.

# 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%"
1
SomeAdmin

J'ai exactement ce dont j'avais besoin avec le code suivant, mon exigence était de configurer VSS mais que cela devait également être visible dans l'interface graphique. La partie clé pour le rendre visible dans l'interface graphique est d'ajouter l'ID de volume dans le nom de la tâche planifiée, comme indiqué par User261949 (c'est un peu étrange, honnêtement, je cherchais une clé de registre, mais je n'ai trouvé absolument rien ..). J'ai fini avec le code suivant qui convient à mes besoins:

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

Merci tout pour vos informations utiles!

0
jiciftw