Script PowerShell de copie de fichiers réseau vers un disque USB

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…

Récupérer la lettre de lecteur USB

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.

  • Par exemple en utilisant USB_BACKUP :
Explorateur Windows | Un disque avec le label USB_backup
  • La commande suivante retournera la lettre du lecteur qui a comme label : USB_BACKUP :
PS C:\ > $(Get-WmiObject Win32_LogicalDisk | Where-Object { $_.VolumeName -match "USB_BACKUP" }).DeviceID.ToString()
PowerShell | Obtenir la lettre de lecteur d'un disque USB

Identifiants Réseau

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.

  • Get-Credential pour récupérer sous forme d'objet les identifiants et les stocker dans la variable $cred :
PS C:\ > $cred = Get-Credential
PowerShell | Get-Credential
  • La commande net use, que je détaillerai juste après n'accepte pas les mots de passe chiffrés, il faudra donc convertir le mot de passe en clair :
PS C:\ > $netcred = $cred.GetNetworkCredential()
PS C:\ > $pass = $netcred.Password
PowerShell | getnetworkcredential

Net use

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.

  • Sans la commande net use, nous ne pouvons pas accéder au partage sans devoir passer par la fenêtre d'authentification :
Windows | fenêtre demandant de rentrer les identifiants réseau
PS C:\ > net use \\BACKUP_SERVER_IP $netcred.Password /USER:$($cred.GetNetworkCredential().UserName)
  • Une fois la commande net use entrée avec les identifiants nous pouvons accéder au partage :
PowerShell | partage veeam backup

Robocopy

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"
  • Options :
    • /MIR : Mode miroir, reflète une arborescence de répertoires (équivalent à /e plus /purge).
    • /R:0 : 0 nouvelle tentative en cas d'échec
    • /W:0 : pas d'attente entre les tentatives qui échouent
    • \\BACKUP_SERVER_IP\d$\Backup : source
    • "$usb_drive\VEEAM" : destination

PowerShell Script

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
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Contact :