Ce site parle de ce qui est censé être un identifiant unique pour les volumes USB dans PowerShell. Il semble y avoir un problème évident. Les volumes sont créés par l'OS, il n'y a donc aucun moyen de garantir contre une collision si le script est exécuté sur un autre système. Il semble que la seule façon de garantir contre les collisions soit d'utiliser un associateur de Win32_DiskDrive ou Get_Disk pour connecter les supports physiques aux volumes. Quelqu'un l'a-t-il fait ? Sinon, existe-t-il un identifiant unique pour les supports de stockage ou les volumes logiques qui m'échappe ?
Réponse
Trop de publicités?Y a-t-il un identifiant unique pour le support de stockage ou le volume logique qui m'échappe ?
Il semble que la seule façon d'éviter les collisions soit d'utiliser un associateur de Win32_DiskDrive ou Get_Disk pour connecter les supports physiques aux volumes.
La réponse Identifiant unique pour la clé USB dans Powershell par Windos suggère d'utiliser le SerialNumber :
Get-WmiObject -Class Win32_Volume | select Name, DeviceID, SerialNumber
Cependant, certains fabricants :
-
Ne pas fournir de numéro de série du tout, ou
-
Utilisez le même numéro de série dans plusieurs appareils.
Solution : Utilisez SerialNumber avec Physical Media et Volume.
Nous pouvons relier l'ID du dispositif, le modèle, les données de partition, l'ID du volume et le numéro de série comme le montre le script PowerShell suivant (basé sur Utilisation de WMI pour relier un volume de disque à un disque physique avec PowerShell ).
Cela permet de générer un identifiant unique pour un disque physique.
Get-DiskDetails.ps1 :
$diskdrive = Get-WmiObject win32_diskdrive
foreach($drive in $diskdrive)
{
out-host -InputObject "`nDevice: $($drive.deviceid.substring(4))`n Model: $($drive.model)"
# partition
$partitions = Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID=`"$($drive.DeviceID.replace('\','\\'))`"} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
foreach($part in $partitions)
{
Out-Host -InputObject " Partition: $($part.name)"
$vols = Get-WmiObject -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=`"$($part.DeviceID)`"} WHERE AssocClass = Win32_LogicalDiskToPartition"
foreach($vol in $vols)
{
out-host -InputObject " Volume: $($vol.name)"
$serial = Get-WmiObject -Class Win32_Volume | where { $_.Name -eq "$($vol.name)\" } | select SerialNumber
out-host -InputObject " Serial Number: $($serial.serialnumber)"
}
}
}
Exemple de sortie :
> .\Get-DiskDetails.ps1
Device: PHYSICALDRIVE0
Model: WDC WD5000LPVX-08V0TT5
Partition: Disk #0, Partition #0
Partition: Disk #0, Partition #1
Partition: Disk #0, Partition #2
Volume: C:
Serial Number: 3369131806
Device: PHYSICALDRIVE1
Model: SanDisk Cruzer USB Device
Partition: Disk #1, Partition #0
Volume: E:
Serial Number: 2157441447
Device: PHYSICALDRIVE2
Model: Seagate Expansion Desk USB Device
Partition: Disk #2, Partition #0
Volume: F:
Serial Number: 911653731
>