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

1

este fala sobre o que significa ser um id único 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?

jamesson
fonte
1
O que há de errado em usar o SerialNumber, conforme descrito na resposta à pergunta vinculada?
DavidPostill
Como eu disse, tanto quanto sei, é atribuído pelo sistema operacional. Se o script for executado em outro sistema operacional com o mesmo dispositivo, tenho uma chance baixa de uma colisão, mas não zero.
jamesson
A partir da resposta vinculada "Finalmente eu inseri os sticks em outro computador, note que o deviceId é diferente, mas o número de série permanece o mesmo."
DavidPostill
Sim, e não há nada lá que garanta que dois volumes sejam atribuídos à mesma série por duas instalações diferentes do Windows.
jamesson
1
O número de série não é atribuído pelo SO.
DavidPostill

Respostas:

1

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

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

A resposta Identificador exclusivo para drive USB em Powershell por Windos sugere o uso do número de série:

Get-WmiObject -Class Win32_Volume | selecione o nome, 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 SerialNumber junto com a mídia física e o volume

Podemos vincular o ID do dispositivo, o modelo, os dados de partição, o ID do volume e o 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)"
      }
    }
  }

Amostra 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
>
DavidPostill
fonte
Sim, vou testar isso nas próximas 24 horas, imaginei que fosse algo assim.
jamesson
Antes de me aprofundar em experimentos, o que você acha que acontecerá se eu fizer dois volumes em um drive USB? Se eles têm diferentes séries, claramente o serial é do os, não?
jamesson
Adivinha, isso também falha. DeviceId é dinamicamente atribuído mesmo no sistema local. Eu já tinha visto esse site antes e esquecido. Para confirmar, tente conectar alguns drives USB em vários pedidos.
jamesson
@jamesson A serial só é fornecida pelo sistema operacional se o próprio dispositivo não fornecer um. A maioria dos fabricantes fornece um.
DavidPostill