我们能否有一种更可靠的方法来确保我们正在查看的驱动器是引导驱动器?我们可以计算所有磁盘/分区/卷如下:
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 and SystemRoot:
…%SystemRoot% 是一个内置变量(以及一小部分
其他人喜欢%SystemDrive%)。也就是说,它实际上并没有在
环境变量存储在
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 在
注册表……另外,设置了%SystemRoot%(和%SystemDrive%)
在安装过程中(当您选择目标
开车)……
以上两个变量都是在 Windows 启动期间设置的,您可以从 elevated 命令提示符查看它们的起源(请参阅Boot Configuration Data (BCD) data stores):
bcdedit /enum ACTIVE
各种来源(在active/system/boot 分区上有基本术语):
Win32 Provider:Win32_DiskPartition类
-
Bootable 属性表示计算机是否可以从此分区启动。
如果为 TRUE,则磁盘分区被标记为可引导。这并不意味着分区上加载了操作系统。
-
BootPartition 财产。分区是活动分区。从硬盘启动时,操作系统使用活动分区。
Storage Volume Provider(已弃用?):Win32_Volume 类(Win32_Volume 和 Win32_DiskDrive 之间不存在直接关系。)
-
SystemVolume 属性指示卷是否包含启动操作系统所需的硬件特定文件。
-
BootVolume 属性表示卷是否包含当前运行的操作系统文件。
Storage Management API Classes(已弃用?):MSFT_Partition 类
-
IsActive 属性表示分区是否处于活动状态并且可以引导。此属性仅与 MBR 磁盘相关。
如果为 TRUE,则 分区处于活动状态并可用于启动系统。此属性仅在磁盘的 PartitionStyle 属性为 MBR(即 MSFT_Disk.PartitionStyle==1)时有效,并且对于所有其他分区样式为 NULL。
-
IsBoot 财产。如果为 TRUE,则该分区是当前 引导分区。
引导分区是保存 Windows 安装的分区。
-
IsSystem 财产。如果为 TRUE,这是一个系统分区。
系统分区包含您的 Windows 需要启动的文件(引导配置数据或 BCD)。保留分区(或系统分区)没有分配字母。