logo rss

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

PowerShell logo

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 :
Clé USB de sauvegarde avec affichage de l'espace de stockage disponible
  • 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() Commande PowerShell pour détecter une clé USB par nom de volume

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 Boîte de dialogue Windows PowerShell de demande d'informations d'identification pour l'authentification des utilisateurs
  • La commande net use, que je détaillerai juste après, n'accepte pas les mots de passe chiffrés. Il faut donc convertir le mot de passe en clair :
PS C:\ > $netcred = $cred.GetNetworkCredential() PS C:\ > $pass = $netcred.Password Script PowerShell démontrant comment obtenir et utiliser les informations d'identification du réseau

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 :
Le système de sécurité Windows demande les informations d'identification du réseau avec un message d'erreur 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 :
Dossier de sauvegarde Veeam montrant les fichiers de sauvegarde complète et incrémentale

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

Le Script PowerShell

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 :

adresse mail de contact