1

Это говорит о том, что подразумевается как уникальный идентификатор для томов USB в PowerShell. Кажется, есть очевидная проблема. Тома создаются ОС, поэтому невозможно гарантировать защиту от коллизий, если скрипт запускается в другой системе. Похоже, что единственный способ гарантировать защиту от коллизий - это использовать какой-либо ассоциированный Win32_DiskDrive из Get_Disk для подключения физического носителя к томам. Кто-нибудь это? Альтернативно, есть ли какой-то уникальный идентификатор для носителя или логического тома, который мне не хватает?

1 ответ1

1

Есть ли какой-то уникальный идентификатор для носителя или логического тома, который мне не хватает?

Кажется, что единственный способ гарантировать защиту от коллизий - это использовать какой-либо ассоциированный Win32_DiskDrive из Get_Disk для подключения физического носителя к томам.

Ответ Уникальный идентификатор USB-накопителя в Powershell от Windos предлагает использовать SerialNumber:

Get-WmiObject -Class Win32_Volume | выберите имя, идентификатор устройства, серийный номер

Однако некоторые производители:

  • Не указывайте серийный номер или

  • Используйте один и тот же серийный номер во многих устройствах.


Решение: используйте SerialNumber вместе с физическим носителем и томом

Мы можем связать воедино идентификатор устройства, модель, данные раздела, идентификатор тома и серийный номер, как показано в следующем скрипте PowerShell (на основе использования WMI для соединения тома диска с физическим диском с помощью PowerShell).

Это позволяет генерировать уникальный идентификатор для физического диска.

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

Образец вывода:

> .\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
>

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .