Nano Hash - криптовалюты, майнинг, программирование

Python WMI — можем ли мы действительно сказать, что «C:» всегда является загрузочным диском?

Я работаю над задачей найти загрузочный диск среди списка подключенных SSD. Попытка получить его путем сопоставления пути устройства ("\\.\PHYSICALDRIVE0") дисков с разделом логического диска с помощью WMI.

Вот мой код:

import wmi
w = wmi.WMI()

for physical_disk in w.Win32_DiskDrive():
     if physical_disk.DeviceID == "\\.\PHYSICALDRIVE0":
           for partition in physical_disk.associators("Win32_DiskDriveToDiskPartition"):
                        for logical in partition.associators("Win32_LogicalDiskToPartition"):
                            if logical.caption == 'C:':
                               print "Its a boot drive"
                               break

Я чувствую, что просто проверить, смотрим ли мы на c-диск, недостаточно. Я чувствую, что это может пойти не так... Мы уверены, что «C:» всегда является загрузочным диском? Вероятно, это происходит в большинстве случаев, но можем ли мы действительно сказать, что «C:» всегда является загрузочным диском?

Можем ли мы найти более надежный способ убедиться, что диск, на который мы смотрим, является загрузочным?

27.06.2019

Ответы:


1

Можем ли мы найти более надежный способ убедиться, что рассматриваемый нами диск является загрузочным? Мы могли бы пронумеровать все диски/разделы/тома следующим образом:

import wmi
w = wmi.WMI()

print ( "\r\nnamespace='root/CIMV2' -> Win32_DiskDrive" )
csvlike='{0:>2}`{1:18}`{2:21}`{3:>5}`{4:>5}`{5:1}`{6:1}`{7}'
# print header
print ( csvlike.format( 'dl',
    'diskDeviceID',
    'partitionDeviceID',
    'BootA',
    'Activ',
    'd',
    'p',
    'diskSerialNumber'))
for w32_disk in w.Win32_DiskDrive():
  auxpart = w32_disk.associators("Win32_DiskDriveToDiskPartition")
  if len( auxpart) == 0:
    print ( csvlike.format( '',w32_disk.DeviceID,'','','',
              w32_disk.Index,'',w32_disk.SerialNumber))
  else:
    for w32_part in auxpart:
      auxlogic = w32_part.associators("Win32_LogicalDiskToPartition")
      if len(auxlogic) == 0:
        print ( csvlike.format( '', w32_disk.DeviceID,
            w32_part.DeviceID,
            str(w32_part.Bootable)      if w32_part.Bootable      else '',
            str(w32_part.BootPartition) if w32_part.BootPartition else '',
            str(w32_part.DiskIndex),       # == w32_disk.Index
            str(w32_part.Index),
            w32_disk.SerialNumber))
      else:
        for w32_ldsk in auxlogic:
          print ( csvlike.format( w32_ldsk.caption,
            w32_disk.DeviceID,
            w32_part.DeviceID,
            str(w32_part.Bootable)      if w32_part.Bootable      else '',
            str(w32_part.BootPartition) if w32_part.BootPartition else '',
            str(w32_part.DiskIndex),    # == w32_disk.Index == party.DiskNumber
            str(w32_part.Index),        # == party.PartitionNumber -1
            w32_disk.SerialNumber))

print ( "\r\nnamespace='root/Microsoft/Windows/Storage' -> MSFT_Disk" )
s = wmi.WMI(namespace='root/Microsoft/Windows/Storage')
csvheader='{0:2}`{1:>5}`{2:>5}`{3:>5}`{4:1}`{5:1}`{6:38}`{7}'
print ( csvheader.format( 'dl', 'Syst', 'Boot', 'Activ', 'd', 'p',
          'volumeUniqueId (truncated to UUID)', 'SerialNumber' ) )
for d in s.MSFT_Disk():
  dps=d.associators("MSFT_DiskToPartition")
  for party in dps:
    auxvolumy = party.associators("MSFT_PartitionToVolume")
    if len( auxvolumy) == 0:
      print ( csvheader.format(
          '',
          str( party.IsSystem ) if party.IsSystem         else '',
          str( party.IsBoot )   if party.IsBoot           else '',
          str( party.IsActive ) if ( d.PartitionStyle==1
                                  and party.IsActive )    else '' ,
          str( party.DiskNumber ),      # == w32_disk.Index
          str( party.PartitionNumber ), # == w32_part.Index +1
          '',
          d.SerialNumber))
    else:
      for volumy in auxvolumy:
        print ( csvheader.format(
          chr( volumy.DriveLetter ) if volumy.DriveLetter else '',
          str( party.IsSystem ) if party.IsSystem         else '',
          str( party.IsBoot )   if party.IsBoot           else '',
          str( party.IsActive ) if ( d.PartitionStyle==1
                                  and party.IsActive )    else '' ,
          str( party.DiskNumber ),      # == w32_disk.Index
          str( party.PartitionNumber ), # == w32_part.Index +1
          volumy.UniqueId[10:][:38],  # .replace('\\?\Volume','')
          d.SerialNumber))



print ( "\r\nnamespace='root/CIMV2' -> Win32_Volume" )
csvheaderwv='{0:2}`{1:>5}`{2:>5}`{3:>5}`{4}'
# print header
print ( csvheaderwv.format( 'dl',
    'Syst',
    'Boot',
    'PageF',
    'volumeDeviceID'))
volumes = w.Win32_Volume()
for volume in volumes:
  print( csvheaderwv.format(
    volume.DriveLetter         if volume.DriveLetter  else '',
    str( volume.SystemVolume ) if volume.SystemVolume else '',
    str( volume.BootVolume )   if volume.BootVolume   else '',
    str( volume.PagefilePresent )   if volume.PagefilePresent   else '',
    volume.DeviceID ))

Уверены ли мы, что C: всегда является загрузочным диском? Обратите внимание на переменные среды только для чтения SystemDrive и SystemRoot:

%SystemRoot% — это встроенная переменная (наряду с небольшим количеством других, таких как %SystemDrive%). То есть он фактически не определен в хранилище переменных окружения по адресу HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment в реестре... Кроме того, %SystemRoot%%SystemDrive%) задаются в процессе установки (при выборе целевого диска)...

Обе вышеуказанные переменные задаются во время загрузки Windows, и вы можете увидеть их происхождение из командной строки с повышенными правами (см. хранилища данных конфигурации загрузки (BCD)):

bcdedit /enum ACTIVE

Различные источники (с основной терминологией для активного/системного/загрузочного раздела):

Поставщик Win32: Win32_DiskPartition class

  • Свойство Bootable указывает, можно ли загрузить компьютер с этого раздела.
    Если TRUE, раздел диска помечен как загрузочный. Это не означает, что на раздел загружается операционная система.
  • BootPartition имущество. Раздел является активным разделом. Операционная система использует активный раздел при загрузке с жесткого диска.

Поставщик тома хранилища ( устарело?): класс Win32_Volume (прямой связи между Win32_Volume и Win32_DiskDrive не существует.)

  • Свойство SystemVolume указывает, содержит ли том аппаратные файлы, необходимые для запуска операционной системы.
  • Свойство BootVolume указывает, содержит ли том текущие файлы операционной системы.

Класс API управления хранилищем (устарело?): MSFT_Partition класс

  • Свойство IsActive указывает, активен ли раздел и может ли он загружаться. Это свойство актуально только для MBR-дисков.
    Если TRUE, раздел активен и может использоваться для запуска системы. Это свойство допустимо только в том случае, если свойство PartitionStyle диска имеет значение MBR (т. е. MSFT_Disk.PartitionStyle==1) и будет иметь значение NULL для всех других стилей разделов.
  • IsBoot свойство. Если TRUE, раздел является текущим загрузочным разделом.
    Загрузочный раздел — это раздел, содержащий установку Windows.
  • IsSystem собственность. Если TRUE, это системный раздел.
    Системный раздел содержит файлы, необходимые для запуска Windows (данные конфигурации загрузки или BCD). Зарезервированные разделы (или системные разделы) не имеют присвоенной им буквы.
25.03.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..