Existe uma maneira de identificar exclusivamente dispositivos de armazenamento USB no Windows (Powershell)?

1

Este fala sobre o que pretende ser um id exclusivo para Volumes USB no PowerShell. Parece haver um problema óbvio. Os volumes são criados pelo sistema operacional, portanto, não há como garantir uma colisão se o script for executado em outro sistema. Parece que a única maneira de garantir contra colisões é usar algum associador de Win32_DiskDrive de Get_Disk para conectar mídia física a volumes. Alguém tem um presente? Como alternativa, existe algum ID exclusivo para mídia de armazenamento ou volume lógico que está faltando?

    
por jamesson 09.06.2017 / 22:21

1 resposta

1

Existe algum ID exclusivo para mídia de armazenamento ou volume lógico que está faltando?

It seems that the only way to guarantee against collisions is to use some associator of either Win32_DiskDrive of Get_Disk to connect physical media to volumes

A resposta Identificador exclusivo para drive USB no Powershell por < um href="https://superuser.com/users/36030/windos"> Windos sugere o uso do SerialNumber:

Get-WmiObject -Class Win32_Volume | select Name, DeviceID, SerialNumber

No entanto, alguns fabricantes:

  • Não forneça um número de série, ou

  • Use o mesmo número de série em muitos dispositivos.

Solução: use o número de série junto com a mídia física e o volume

Podemos vincular o ID do dispositivo, modelo, dados de partição, ID do volume e número de série, conforme demonstrado pelo seguinte script do PowerShell (com base em Usando o WMI para vincular um volume de disco a um disco físico com o PowerShell ).

Isso permite a geração de um ID exclusivo para um disco físico.

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)"
      }
    }
  }

Exemplo de saída :

> .\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
>
    
por 09.06.2017 / 23:20