Dans le but de respecter la règle de la sauvegarde 3-2-1 j'ai développé un petit script PowerShell dont le but est de copier des fichiers de sauvegarde (des fichiers VEEAM dans mon cas mais ça fonctionne pour d'autres fichiers) vers un disque USB. Le but étant de rendre la copie accessible à n'importe quel utilisateur. En effet ce dernier n'aura besoin que de rentrer les identifiants du serveur de sauvegarde.
La problématique est la suivante : copier les fichiers de sauvegarde présentes sur un serveur de sauvegarde distant vers un disque USB connecté à un poste local et dont les identifiants du serveur ne sont pas pré-enregistrés.
Voyons en détail, comment tout cela fonctionne…
L'objectif ici est de récupérer automatiquement la lettre de lecteur de notre disque USB. Pour se faire, nous allons définir un label bien précis pour notre disque et le script récupera la lettre de lecteur associée à ce label.
PS C:\ > $(Get-WmiObject Win32_LogicalDisk | Where-Object { $_.VolumeName -match "USB_BACKUP" }).DeviceID.ToString()
Maitnenant nous allons afficher une fenêtre d'authentification avec la commande Get-Credential, pour permettre à l'utilisateur de rentrer les identifiants du serveur de sauvegarde.
PS C:\ > $cred = Get-Credential
PS C:\ > $netcred = $cred.GetNetworkCredential()
PS C:\ > $pass = $netcred.Password
Nous utiliserons la commande net use avec les identifiants précédement récupérés dans le but d'établir une connexion avec le serveur de sauvegardes.
PS C:\ > net use \\BACKUP_SERVER_IP $netcred.Password /USER:$($cred.GetNetworkCredential().UserName)
L'opération de copie sera réalisée avec l'aide de l'outil robocopy. Passons en revu les options retenues.
PS C:\ > robocopy /MIR /R:0 /W:0 \\BACKUP_SERVER_IP\d$\Backup "$usb_drive\VEEAM"
Remplacer BACKUP_SERVER_IP avec l'adresse IP du serveur de sauvegarde.
###########################
# author : shebangthedolphins.net
# version : 1.0
# date : 2021.03
# role : backup the backups to USB drive backup
# other : Tested on Windows 2019 Server
# updates :
# - 1.0 (2021/03) : First Version
#Get drive letter, quit if not found
$usb_drive = try { $(Get-WmiObject Win32_LogicalDisk | Where-Object { $_.VolumeName -match "USB_BACKUP" }).DeviceID.ToString() } catch { exit 1 }
#get credential window
$cred = Get-Credential
#get user and password credentials for net use command (see : https://stackoverflow.com/questions/612015/copy-item-with-alternate-credentials)
$netcred = $cred.GetNetworkCredential()
$pass = $netcred.Password
#connect to the BACKUP_SERVER_IP network resource
net use \\BACKUP_SERVER_IP $netcred.Password /USER:$($cred.GetNetworkCredential().UserName)
#mirror copy of files from "\\BACKUP_SERVER_IP\\d$\Backup" to "USB_DRIVE\VEEAM" folder
robocopy /MIR /R:0 /W:0 \\BACKUP_SERVER_IP\d$\Backup "$usb_drive\VEEAM"
#cancels the BACKUP_SERVER_IP network connection
net use /delete \\BACKUP_SERVER_IP
Contact :