我正在执行一项任务,以在连接的SSD列表中找到启动驱动器。 试图通过使用WMI将驱动器的设备路径(“ \\。\ PHYSICALDRIVE0”)与逻辑磁盘分区进行匹配来获取它。
这是我的代码:
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:”始终是启动驱动器吗?
我们可以采用一种更可靠的方法来确保我们正在查看的驱动器是引导驱动器吗?
答案 0 :(得分:0)
我们可以采用一种更可靠的方法来确保所查看的驱动器是引导驱动器吗? 我们可以对所有个磁盘/分区/卷如下:
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启动时设置的,您可以从升高的命令提示符下看到它们的来源(请参见Boot Configuration Data (BCD) data stores):
bcdedit /enum ACTIVE
各种来源(在 active / 系统 / boot 分区上具有基本术语):
Win32 Provider:Win32_DiskPartition
类
Bootable
属性指示是否可以从该分区引导计算机。
BootPartition
属性。分区是活动分区。从硬盘启动时,操作系统使用活动分区。 Storage Volume Provider(不建议使用?):Win32_Volume
类(Win32_Volume
和Win32_DiskDrive
之间没有直接关系。)
SystemVolume
属性指示该卷是否包含启动操作系统所需的硬件特定文件。BootVolume
属性指示该卷是否包含当前正在运行的操作系统文件。 Storage Management API Classes(不建议使用?):MSFT_Partition
类
IsActive
属性表示该分区是否处于活动状态并且可以启动。此属性仅与MBR磁盘相关。
PartitionStyle
属性为MBR(即MSFT_Disk.PartitionStyle == 1)时,此属性才有效;对于所有其他分区样式,该属性为NULL。IsBoot
属性。如果为TRUE,则该分区为当前的引导分区。
IsSystem
属性。如果为TRUE,则为系统分区。