Script PowerShell de copie de fichiers réseau vers un disque USB
- Mise à jour le 06 nov. 2024

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.
- Ce que fait le script :
- Obtenir la lettre de lecteur du disque USB
- Demander les identifiants réseau via une fenêtre utilisateur
- Copie des fichiers vers un disque USB
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
:

- 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()

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

- 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

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 :

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 :

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
avec/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