Python WMI-我们真的可以说“ C:”始终是引导驱动器吗?

时间:2019-06-27 06:10:08

标签: python wmi

我正在执行一项任务,以在连接的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:”始终是启动驱动器吗?

我们可以采用一种更可靠的方法来确保我们正在查看的驱动器是引导驱动器吗?

1 个答案:

答案 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 ProviderWin32_DiskPartition

  • Bootable属性指示是否可以从该分区引导计算机。
    如果为TRUE,则磁盘分区被标记为可引导。这并不意味着在分区上已加载操作系统。
  • BootPartition属性。分区是活动分区。从硬盘启动时,操作系统使用活动分区。

Storage Volume Provider(不建议使用?):Win32_Volume类(Win32_VolumeWin32_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)。保留分区(或系统分区)没有分配字母。