Il sistema operativo Microsoft, in determinate circostanze, come gli aggiornamenti di Windows, o su richiesta durante l'installazione di alcuni programmi, crea un punto di ripristino della configurazione che permette di tornare indietro, alla configurazione precedente, e superare eventuali problemi che si sono creati dopo l'operazione che avevamo eseguito. Esiste una sua interfaccia da cui gestire, creare o disattivare i punti di ripristino, ma in questo articolo vedremo come farlo con PowerShell e Vssadmin.

Per i vari comandi, che vedrete nel resto dell'articolo, prendo sempre ad esempio il mio computer, le lettere unità disco o i numeri dei punti di ripristino vanno ovviamente modificati e adattati a quelli che rilevate nel vostro computer.
Attivare/disattivare il ripristino
Per attivare il ripristino della configurazione in un disco fisso, va sempre inserita anche la lettera C: del disco di sistema, si utilizza il seguente comando: Enable-ComputerRestore -Drive "c:","d:","e:"

Se invece si vuole disattivarla in un disco in particolare si utilizza: Disable-ComputerRestore -Drive "e:"
Invece il comando vssadmin resize shadowstorage /for=d: /on=d: /maxsize=10% stabilisce la percentuale del disco fisso assegnata ai file del ripristino di configurazione.

Punti di ripristino presenti
Il comando Get-ComputerRestorePoint mostra i punti di ripristino attualmente presenti.

Creare punto di ripristino
Per creare manualmente un singolo punto di ripristino va utilizzato il seguente comando: Checkpoint-Computer -Description "xxx" -RestorePointType "xxx", vanno inserite una descrizione (-Description) e il tipo di punto di ripristino (-RestorePointType), dove è possibile usare solo queste voci:
APPLICATION_INSTALLAPPLICATION_UNINSTALLDEVICE_DRIVER_INSTALLMODIFY_SETTINGSCANCELLED_OPERATION
Se non inseriamo questa seconda opzione, di default viene salvata come APPLICATION_INSTALL.

Da PowerShell è possibile creare un solo punto di ripristino al giorno, ovvero ogni 1140 minuti, se volessimo modificare questo valore bisogna creare una nuova chiave DWORD (32 bit), chiamata SystemRestorePointCreationFrequency e dargli un valore numerico anche di un minuto volendo, la chiave va creata in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore.

Data e ora
Se volessimo sapere in che data e ora è stato creato un punto di ripristino possiamo utilizzare questo script: Get-ComputerRestorePoint | Format-Table -AutoSize Description, SequenceNumber, @{n="Date";e={[System.Management.ManagementDateTimeConverter]::ToDateTime($_.creationtime)}}

Utilizzare un punto di ripristino
Per poter ripristinare un singolo punto, a nostra scelta, abbiamo a disposizione il comando: Restore-Computer -RestorePoint xx, al posto delle xx va messo il SequenceNumber che vediamo nel cmdlet Get-ComputerRestorePoint.
L'utilizzo di questo comando provocherà un riavvio del computer e l'applicazione del punto di ripristino scelto.
Cancellare i punti di ripristino
PowerShell non ha un cmdlet per la cancellazione dei punti di ripristino, lo possiamo fare tramite il comando vssadmin.
Con vssadmin Delete Shadows /For=C: cancelliamo i punti di ripristino presenti nel disco C:, mentre vssadmin delete shadows /all cancella i punti di ripristino da qualsiasi disco fisso del computer.

Invece vssadmin delete shadows /for=c: /oldest cancella il punto di ripristino più vecchio, se si aggiunge l'opzione /quiet non serve dare la conferma al comando.

Con il commando vssadmin list shadows /for=c: vediamo la lista dettagliata di tutti I punti di ripristino presenti nel disco C:, se vogliamo cancellarne uno dobbiamo recuperare il suo ID copia shadow.

Per cancellare un punto di ripristino a nostra scelta va usato il comando: vssadmin delete shadows /Shadow={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} dove al posto delle varie X va inserito il valore rilevato nell'ID copia shadow preso dal comando precedente.
Il comando diventerà qualcosa di simile a questo: vssadmin delete shadows /Shadow={a4df9af8-c4be-40dd-abfb-7f8920d2dc20}
Una avvertenza, nel computer dove ho fatto le prove questo comando non sono riuscito a farlo funzionare, e non ho ben capito perché, da PowerShell, mentre ha funzionato dal prompt dei comandi aperto come amministratore.
