Utiliser PowerShell pour activer ou désactiver la restauration système sur les systèmes Windows

La restauration système est une fonction puissante de Windows qui permet aux utilisateurs de ramener leur système à un état antérieur, afin de résoudre les problèmes causés par des mises à jour erronées, des installations de logiciels ou d’autres changements. Pour les professionnels de l’informatique et les fournisseurs de services gérés (MSP), il est essentiel de configurer la restauration du système de manière efficace et programmatique, en particulier lorsqu’il s’agit de gérer plusieurs systèmes. Un script PowerShell efficace, comme celui fourni ici, offre un moyen précis et automatisé d’activer ou désactiver la restauration système, et d’en gérer les points de restauration sur les périphériques Windows.

Contexte

La restauration du système protège l’intégrité du système en créant des instantanés appelés points de restauration. Si cette fonction peut s’avérer salvatrice en cas d’urgence, sa configuration nécessite souvent une intervention administrative, en particulier dans les environnements d’entreprise. La configuration manuelle n’est pas extensible pour les grands réseaux, ce qui rend indispensable une solution basée sur PowerShell. Ce script rationalise la gestion de la restauration système, aidant les équipes informatiques à s’assurer que les systèmes sont configurés de manière cohérente tout en évitant les problèmes potentiels tels que les suppressions excessives de Shadow copy.

Le script :

#Requires -Version 5.1

<#
.SYNOPSIS
    Enables or Disables System Restore on System Drive(C:). Use caution when enabling on a system that contains system image backups(VSS).
.DESCRIPTION
    Enables or Disables System Restore on System Drive(C:). Use caution when enabling on a system that contains system image backups(VSS), as it will cause shadow copies to be deleted faster than normal.

    By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).

.EXAMPLE
    (No Parameters)
    ## EXAMPLE OUTPUT WITHOUT PARAMS ##

PARAMETER: -Action "Enable"
    Enables System Restore.
.EXAMPLE
    -Action "Enable"
    ## EXAMPLE OUTPUT WITH Action ##
    [Info] Enabling System Restore
    [Info] Enabled System Restore

PARAMETER: -Action "Disable"
    Disables System Restore.
.EXAMPLE
    -Action "Disable"
    [Info] Disabling System Restore
    [Info] Disabled System Restore

PARAMETER: -Action "DisableAndRemove"
    Disables System Restore and removes all existing restore points.
.EXAMPLE
    -Action "DisableAndRemove"
    [Info] Disabling System Restore
    [Info] Disabled System Restore
    [Info] Removing Existing Restore Points
    [Info] Removed Existing Restore Points

.NOTES
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    Release Notes: Initial Release
#>

[CmdletBinding()]
param (
    [Parameter()]
    [ValidateSet("Enable", "Disable", "DisableAndRemove")]
    [string]$Action
)

begin {
    $EnableSystemRestore = $false
    $DisableSystemRestore = $false
    $RemoveExistingRestorePoints = $false
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }

    # If the registry value is 1, System Restore is enabled.
    $RegValue = Get-ItemPropertyValue -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore\" -Name "RPSessionInterval" -ErrorAction SilentlyContinue

    $SystemRestoreStatus = if ($RegValue -ge 1) {
        # If either of the above conditions are met, System Restore is enabled.
        Write-Output "Enabled"
    }
    else {
        Write-Output "Disabled"
    }

    # Check if the action Script Variable was used
    if ($env:action -and $env:action -ne "null") {
        switch ($env:action) {
            "Enable" { $EnableSystemRestore = $true }
            "Disable" { $DisableSystemRestore = $true }
            "Disable and Remove Existing Restore Points" { $RemoveExistingRestorePoints = $true }
            Default {
                Write-Host -Object "[Error] Invalid Action"
                exit 1
            }
        }
        
    }
    # Check if the parameter Action was used
    else {
        switch ($Action) {
            "Enable" { $EnableSystemRestore = $true }
            "Disable" { $DisableSystemRestore = $true }
            "DisableAndRemove" { $RemoveExistingRestorePoints = $true }
            Default {
                Write-Host -Object "[Error] Invalid Action"
                exit 1
            }
        }
    }
    function Remove-ComputerRestorePoint {
        [CmdletBinding(SupportsShouldProcess = $True)]param(
            [Parameter(
                Position = 0,
                Mandatory = $true,
                ValueFromPipeline = $true
            )]
            $RestorePoint
        )
        begin {
            $fullName = "SystemRestore.DeleteRestorePoint"
            #check if the type is already loaded
            $isLoaded = $null -ne ([AppDomain]::CurrentDomain.GetAssemblies() | ForEach-Object { $_.GetTypes() } | Where-Object { $_.FullName -eq $fullName })
            if (!$isLoaded) {
                $SRClient = Add-Type -MemberDefinition @"
[DllImport ("Srclient.dll")]
public static extern int SRRemoveRestorePoint (int index);
"@ -Name DeleteRestorePoint -Namespace SystemRestore -PassThru
            }
        }
        process {
            foreach ($restorePoint in $RestorePoint) {
                if ($PSCmdlet.ShouldProcess("$($restorePoint.Description)", "Deleting Restore Point")) {
                    [SystemRestore.DeleteRestorePoint]::SRRemoveRestorePoint($restorePoint.SequenceNumber) | Out-Null
                }
            }
        }
    }
}
process {
    if (-not (Test-IsElevated)) {
        Write-Host -Object "[Error] Access Denied. Please run with Administrator privileges."
        exit 1
    }

    # Get Windows Install Drive from SystemRoot
    $TargetDrive = "$($env:SystemRoot -split "\\" | Select-Object -First 1)\"

    $ExitCode = 0
    # When the action is Enable
    if ($EnableSystemRestore) {
        if ($SystemRestoreStatus -eq "Enabled") {
            Write-Host -Object "[Info] System Restore is already enabled."
            exit 0
        }

        # Save the current value of the SystemRestorePointCreationFrequency registry key
        $OldValue = try {
            Get-ItemPropertyValue -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\SystemRestore" -Name "SystemRestorePointCreationFrequency" -ErrorAction Stop -WarningAction Stop
        }
        catch {
            # Return the default value of 1440 minutes if the registry key does not exist
            1440
        }
        if ($null -ne $OldValue) {
            Set-ItemProperty -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\SystemRestore" -Name "SystemRestorePointCreationFrequency" -Value "0" -ErrorAction SilentlyContinue
        }

        # Enable System Restore
        try {
            Write-Host -Object "[Info] Enabling System Restore: $TargetDrive"
            Enable-ComputerRestore -Drive "$TargetDrive"
            Write-Host -Object "[Info] Enabled System Restore: $TargetDrive"
        }
        catch {
            Write-Host -Object "[Error] Failed to enable System Restore"
            $ExitCode = 1
        }

        try {
            Write-Host -Object "[Info] Creating restore point."

            # Create a new restore point
            Checkpoint-Computer -Description "Restore Point Created by Enable or Disable System Restore" -RestorePointType "MODIFY_SETTINGS" -ErrorAction Stop -WarningAction Stop

            Write-Host -Object "[Info] Created Restore Point."
        }
        catch {
            Write-Host -Object "[Error] Failed to create restore point."
            $ExitCode = 1
        }

        # Restore the old value of the SystemRestorePointCreationFrequency registry key
        if ($null -ne $OldValue) {
            Set-ItemProperty -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\SystemRestore" -Name "SystemRestorePointCreationFrequency" -Value $OldValue -ErrorAction SilentlyContinue
        }
    }
    # When the action is Disable
    elseif ($DisableSystemRestore) {
        if ($SystemRestoreStatus -eq "Disabled") {
            Write-Host -Object "[Info] System Restore is already disabled."
            exit 0
        }
        # Disable System Restore
        try {
            Write-Host -Object "[Info] Disabling System Restore: $TargetDrive"
            Disable-ComputerRestore -Drive "$TargetDrive"
            Write-Host -Object "[Info] Disabled System Restore: $TargetDrive"
        }
        catch {
            Write-Host -Object "[Error] Failed to disable System Restore"
            $ExitCode = 1
        }
    }
    # When the action is DisableAndRemove / Disable and Remove Existing Restore Points
    elseif ($RemoveExistingRestorePoints) {
        if ($SystemRestoreStatus -eq "Disabled") {
            Write-Host -Object "[Info] System Restore is already disabled."
            exit 0
        }
        # Remove all existing restore points
        try {
            Write-Host -Object "[Info] Removing Existing Restore Points"
            Get-ComputerRestorePoint | Remove-ComputerRestorePoint
            Write-Host -Object "[Info] Removed Existing Restore Points"
        }
        catch {
            Write-Host -Object "[Error] Failed to remove existing restore points"
            $ExitCode = 1
        }
        # Disable System Restore
        try {
            Write-Host -Object "[Info] Disabling System Restore: $TargetDrive"
            Disable-ComputerRestore -Drive "$TargetDrive"
            Write-Host -Object "[Info] Disabled System Restore: $TargetDrive"
        }
        catch {
            Write-Host -Object "[Error] Failed to disable System Restore"
            $ExitCode = 1
        }
    }
    exit $ExitCode
}
end {
    
    
    
}

 

Gagnez du temps avec plus de 300+ scripts du Dojo NinjaOne.

Obtenir l’accès

Description détaillée

Le script est bien structuré et polyvalent, et s’articule autour de trois actions principales :

  1. Activer la restauration système : active la fonctionnalité de restauration du système.
  2. Désactiver la restauration système : désactive la restauration système sans supprimer les points de restauration existants.
  3. Désactiver et supprimer les points de restauration : désactive la restauration du système et supprime tous les points de restauration existants.

Voici comment fonctionne le script, étape par étape :

1. Initialisation et gestion des paramètres :

a. Le script commence par définir les paramètres (Activer, Désactiver et Désactiver et supprimer) et initialiser les variables pour gérer ces actions.

b. Il vérifie si le script est exécuté avec des privilèges administrateur à l’aide de la fonction Test-IsElevated. Cela permet d’obtenir les autorisations nécessaires pour modifier les paramètres du système.

2. Détection de l’état actuel de la restauration du système :

a. Le script récupère l’état actuel de la restauration du système dans le registre Windows. Si la clé de registre RPSessionInterval existe et possède une valeur, la restauration du système est considérée comme activée.

3. Exécution de l’action :

a. En fonction de l’action spécifiée, le script exécute les tâches correspondantes :

i. Activer : active la restauration système sur le lecteur système et crée un nouveau point de restauration.

ii. Désactiver : désactive la restauration système.

iii. Désactiver et supprimer : désactive la restauration système et supprime tous les points de restauration existants à l’aide de la fonction Remove-ComputerRestorePoint.

4. Gestion des erreurs :

a. Tout au long du script, les exceptions sont détectées et des messages d’erreur détaillés sont enregistrés. Cela assure la transparence et aide les professionnels de l’informatique à résoudre les problèmes de manière efficace.

Cas d’utilisation potentiels

Étude de cas : gestion automatisée des terminaux

Imaginez un MSP qui gère des centaines de terminaux pour un client. Pour garantir des capacités de retour en arrière cohérentes, le MSP utilise ce script pour activer la restauration système sur toutes les machines pendant le déploiement. Plus tard, pour libérer de l’espace disque, il exécute le script avec le paramètre DisableAndRemove (Désactiver et supprimer) sur les appareils qui approchent des limites de stockage. Cette approche automatisée permet de gagner du temps et de réduire les erreurs par rapport aux configurations manuelles.

Comparaisons

D’autres méthodes de gestion de la restauration système incluent l’utilisation de l’interface graphique de Windows ou de la stratégie de groupe. Si l’interface graphique est simple pour les utilisateurs individuels, elle est inefficace pour les opérations à grande échelle. La stratégie de groupe permet un contrôle centralisé, mais n’offre pas la précision et le retour immédiat de PowerShell. Ce script comble le fossé en permettant une évolutivité, une précision et un retour immédiat sur l’exécution.

FAQ

1. Ce script peut-il être utilisé sur d’anciennes versions de Windows ?

Le script est conçu pour Windows 10 et Windows Server 2016 ou une version ultérieure. Pour les versions plus anciennes, des ajustements aux clés de registre ou aux commandes peuvent être nécessaires.

2. Que se passe-t-il si j’exécute le script pour activer ou désactiver la restauration système sans les privilèges de l’administrateur ?

Le script vérifie l’existence de droits d’administration et se termine si des privilèges insuffisants sont détectés, empêchant ainsi une exécution partielle.

3. L’activation de la restauration du système affectera-t-elle les sauvegardes existantes de l’image du système ?

Oui, l’activation de la restauration du système peut augmenter les suppressions de Shadow copy, ce qui peut interférer avec les sauvegardes d’image système.

Implications

L’utilisation correcte de ce script peut améliorer considérablement la résilience des terminaux, mais une mauvaise gestion peut entraîner une perte de données, en particulier lors de la suppression des points de restauration. Les administrateurs informatiques doivent trouver le juste milieu entre les avantages de la restauration du système, les contraintes de stockage potentielles et les stratégies de sauvegarde.

Recommandations

  • Test dans un environnement contrôlé : testez toujours les scripts dans un laboratoire ou un environnement d’essai avant de les déployer sur des systèmes de production.
  • Modifications du document : conservez une trace du moment et de l’endroit où le script est exécuté afin de maintenir une piste d’audit claire.
  • Intégrer les solutions de sauvegarde : combinez les configurations de restauration du système avec des stratégies de sauvegarde complètes pour garantir une protection optimale.

Conclusion

Ce script PowerShell est un outil précieux pour les professionnels de l’informatique qui souhaitent gérer efficacement la restauration système. Il permet l’automatisation, la cohérence et la précision, en relevant les défis des configurations manuelles. Pour ceux qui cherchent à rationaliser davantage la gestion des terminaux, des solutions comme NinjaOne peuvent offrir des outils intégrés pour la surveillance, l’automatisation et la gestion des sauvegardes, garantissant ainsi un environnement informatique efficace et sécurisé.

Pour aller plus loin

Pour créer une équipe informatique efficace et performante, il est essentiel d'avoir une solution centralisée qui joue le rôle de nœud principal pour vos services. NinjaOne permet aux équipes informatiques de surveiller, gérer, sécuriser et prendre en charge tous les appareils, où qu'ils soient, sans avoir besoin d'une infrastructure complexe sur site. Pour en savoir plus sur NinjaOne Endpoint Management, participez à une visite guidée, ou profitez d'un essai gratuit de la plateforme NinjaOne.

Catégories :

Vous pourriez aussi aimer

×

Voir NinjaOne en action !

En soumettant ce formulaire, j'accepte la politique de confidentialité de NinjaOne.

Termes et conditions NinjaOne

En cliquant sur le bouton “J’accepte” ci-dessous, vous indiquez que vous acceptez les termes juridiques suivants ainsi que nos conditions d’utilisation:

  • Droits de propriété: NinjaOne possède et continuera de posséder tous les droits, titres et intérêts relatifs au script (y compris les droits d’auteur). NinjaOne vous accorde une licence limitée pour l’utilisation du script conformément à ces conditions légales.
  • Limitation de l’utilisation: Les scripts ne peuvent être utilisés qu’à des fins personnelles ou professionnelles internes légitimes et ne peuvent être partagés avec d’autres entités.
  • Interdiction de publication: Vous n’êtes en aucun cas autorisé à publier le script dans une bibliothèque de scripts appartenant à, ou sous le contrôle d’un autre fournisseur de logiciels.
  • Clause de non-responsabilité: Le texte est fourni “tel quel” et “tel que disponible”, sans garantie d’aucune sorte. NinjaOne ne promet ni ne garantit que le script sera exempt de défauts ou qu’il répondra à vos besoins ou attentes particulières.
  • Acceptation des risques: L’utilisation du script est sous votre propre responsabilité. Vous reconnaissez qu’il existe certains risques inhérents à l’utilisation du script, et vous comprenez et assumez chacun de ces risques.
  • Renonciation et exonération de responsabilité: Vous ne tiendrez pas NinjaOne pour responsable des conséquences négatives ou involontaires résultant de votre utilisation du script, et vous renoncez à tout droit ou recours légal ou équitable que vous pourriez avoir contre NinjaOne en rapport avec votre utilisation du script.
  • EULA: Si vous êtes un client de NinjaOne, votre utilisation du script est soumise au contrat de licence d’utilisateur final qui vous est applicable (End User License Agreement (EULA)).