É certamente possível mapear partições (e, portanto, direcionar letras) para os dispositivos no WMI (que wmic
consultas). No entanto, pode exigir um pouco de esforço seguir as associações de um objeto WMI para outros com WQL : a linguagem de consulta "SQL Like" do WMI (ver link para a documentação).
Usando o PowerShell (porque eu o conheço melhor e facilita muito a execução de expressões):
O PSH também tem uma capacidade de transcrição, portanto, com algumas edições e anotações:
PS [64] E:\ #35> gwmi WIN32_LogicalDisk
[...]
DeviceID : F:
DriveType : 3
ProviderName :
FreeSpace : 1660612608
Size : 2147479552
VolumeName : Messages
[...]
Uma instância de Win32_LogicalDisk
existe por partição : geralmente é um bom ponto de partida para qualquer coisa relacionada a discos. Mas quero mais detalhes, incluindo os meta-dados para identificar exclusivamente essa instância, para que eu possa procurar associações. Portanto, use Format-List
(com alias para fl
) para listar todas as propriedades:
PS [64] E:\ #37> gwmi -query 'select * from WIN32_LogicalDisk where DeviceId="F:"' | fl *
PSComputerName : MyComputer
Status :
Availability :
DeviceID : F:
StatusInfo :
__GENUS : 2
__CLASS : Win32_LogicalDisk
__SUPERCLASS : CIM_LogicalDisk
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_LogicalDisk.DeviceID="F:"
__PROPERTY_COUNT : 40
__DERIVATION : {CIM_LogicalDisk, CIM_StorageExtent, CIM_LogicalDevice, CIM_LogicalElement...}
__SERVER : MyComputer
__NAMESPACE : root\cimv2
__PATH : \MyComputer\root\cimv2:Win32_LogicalDisk.DeviceID="F:"
[...]
Caption : F:
Compressed : False
[...]
Description : Local Fixed Disk
DriveType : 3
[...]
FileSystem : NTFS
FreeSpace : 1660612608
[...]
MediaType : 12
Name : F:
[...]
VolumeName : Messages
VolumeSerialNumber : 5A5189FB
[...]
E, em seguida, para capturar o __RELPATH
( __PATH
também funciona, mas tudo é local aqui, não preciso do nome do computador nem do namespace WMI: tudo que estou fazendo é em root\cimv2
). / p>
PS [64] E:\ #38> $DriveFPath = (gwmi -query 'select * from WIN32_LogicalDisk where DeviceId="F:"').__RELPATH
Agora, o bit inteligente: que outros objetos estão vinculados ao objeto da unidade:
PS [64] E:\ #39> gwmi -query "associators of {$DriveFPath}" | ft -auto __CLASS,__RELPATH
__CLASS __RELPATH
------- ---------
Win32_DiskPartition Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
Win32_Directory Win32_Directory.Name="f:\"
Win32_ComputerSystem Win32_ComputerSystem.Name="MyComputer"
Este parece interessante:
PS [64] E:\ #42> gwmi -query "associators of {$DriveFPath} where resultclass=Win32_diskpartition" | fl *
[...]
Name : Disk #0, Partition #0
__GENUS : 2
__CLASS : Win32_DiskPartition
__SUPERCLASS : CIM_DiskPartition
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
__PROPERTY_COUNT : 34
__DERIVATION : {CIM_DiskPartition, CIM_StorageExtent, CIM_LogicalDevice, CIM_LogicalElement...}
__SERVER : MyComputer
__NAMESPACE : root\cimv2
__PATH : \MyComputer\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #0"
[...]
Caption : Disk #0, Partition #0
[...]
Description : GPT: Basic Data
DeviceID : Disk #0, Partition #0
[...]
Mas não contém o que eu quero. Então repita o processo:
PS [64] E:\ #43> $DiskPartitionPath = (gwmi -query "associators of {$DriveFPath} where resultclass=Win32_diskpartition").__RELPATH
PS [64] E:\ #47> gwmi -query "associators of {$DiskPartitionPath}" | ft -auto __CLASS,__RELPATH
__CLASS __RELPATH
------- ---------
Win32_ComputerSystem Win32_ComputerSystem.Name="MyComputer"
Win32_DiskDrive Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE0"
Win32_LogicalDisk Win32_LogicalDisk.DeviceID="F:"
Por isso, vincula-se de volta ao Win32_LogicalDisk
onde começamos, mas, neste caso, Win32_DiskDrive
parece ser útil (o valor do __RELPATH
é uma pista: sei que esse é o tipo de nomeação do Windows usa para seus discos físicos):
PS [64] E:\ #48> gwmi -query "associators of {$DiskPartitionPath} where resultclass=Win32_DiskDrive" | fl *
[...]
DeviceID : \.\PHYSICALDRIVE0
StatusInfo :
Partitions : 2
BytesPerSector : 512
ConfigManagerUserConfig : False
DefaultBlockSize :
Index : 0
InstallDate :
InterfaceType : IDE
[...]
SectorsPerTrack : 63
Size : 1500299297280
TotalCylinders : 182401
TotalHeads : 255
TotalSectors : 2930272065
TotalTracks : 46512255
TracksPerCylinder : 255
__GENUS : 2
__CLASS : Win32_DiskDrive
__SUPERCLASS : CIM_DiskDrive
__DYNASTY : CIM_ManagedSystemElement
__RELPATH : Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE0"
__PROPERTY_COUNT : 51
__DERIVATION : {CIM_DiskDrive, CIM_MediaAccessDevice, CIM_LogicalDevice, CIM_LogicalElement...}
__SERVER : MyComputer
__NAMESPACE : root\cimv2
__PATH : \MyComputer\root\cimv2:Win32_DiskDrive.DeviceID="\\.\PHYSICALDRIVE0"
Availability :
Capabilities : {3, 4}
CapabilityDescriptions : {Random Access, Supports Writing}
Caption : ST31500341AS ATA Device
CompressionMethod :
CreationClassName : Win32_DiskDrive
Description : Disk drive
[...]
Model : ST31500341AS ATA Device
Name : \.\PHYSICALDRIVE0
PNPDeviceID : IDE\DISKST31500341AS____________________________CC1H____&2CC8A95A&0&2.0.0
[...]
SerialNumber : 2020202020202020202020205639325333323235
Signature :
[...]
E aí está você. (Eu suspeito que o valor de SerialNumber
esteja codificado - 20
poderia ser o código ASCII para um espaço em hexadecimal, mas verificando que precisaria abrir meu computador e tirar a unidade de disco: deixarei isso como um exercício: -)).