Можем ли мы найти более надежный способ убедиться, что рассматриваемый нами диск является загрузочным? Мы могли бы пронумеровать все диски/разделы/тома следующим образом:
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