【问题标题】:Python WMI - can we really say that 'C:' is always the boot drive?Python WMI - 我们真的可以说'C:'始终是引导驱动器吗?
【发布时间】:2019-06-27 06:10:08
【问题描述】:

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

我们能否有一种更可靠的方法来确保我们正在查看的驱动器是引导驱动器?

【问题讨论】:

    标签: python wmi


    【解决方案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 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_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)。保留分区(或系统分区)没有分配字母。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-13
      • 2022-07-09
      • 1970-01-01
      • 2015-10-04
      • 2019-08-14
      • 2016-12-23
      • 2016-05-02
      • 2013-10-25
      相关资源
      最近更新 更多