Другие ответы с отношением WMI хороши, если вас не волнует том точки монтирования , поскольку с WMI невозможно напрямую связать том точки монтирования с разделом или диском.
Но есть раздел реестра, который поможет вам выяснить некоторую информацию, которая поможет вам построить соединение, как это делает Windows:
function getVolumeInformation{
param($hostName, $credential)
$volumeInformation = getVolumeInformation -computerName $hostName -credential $credential
$WMIRegistryMountedDeviceInfo = WMIRegistryMountedDeviceInfo -computerName $hostName -Credential $credential
foreach($volumeSerial in $volumeInformation.keys){
if($WMIRegistryMountedDeviceInfo.containsKey($volumeSerial)){
$volumeInformation[$volumeSerial]["diskPartitionStartingOffset"]=$WMIRegistryMountedDeviceInfo[$volumeSerial].diskPartitionStartingOffset
$volumeInformation[$volumeSerial]["diskDriveSignature"]=$WMIRegistryMountedDeviceInfo[$volumeSerial].diskDriveSignature
$volumeInformation[$volumeSerial]["wmiValueRegistry"]=$WMIRegistryMountedDeviceInfo[$volumeSerial].wmiValue
}
}
return $volumeInformation
}
function getWMIVolumeInformation{
param($computerName, $credential)
$diskToVolumeAssociation = @{}
$regexGetVolumeSerial = ".*Volume{(.*)}.*"
$wmiVolumes = $null
$wmiVolumes = Get-WmiObject Win32_Volume -Credential $credential -ComputerName $computerName -filter "DriveType != 5" -ErrorVariable errorWMIVolume -ErrorAction SilentlyContinue
$volumeInfo = @{}
$wmiVolumes | Foreach-Object {
$wmiVolume = $_
if($wmiVolume.DeviceID -match $regexGetVolumeSerial){
$wmiVolumeSerial = $Matches[1]
$volumeInfo[$wmiVolumeSerial] = @{}
$volumeInfo[$wmiVolumeSerial]["wmiInfo"] = $wmiVolume
$volumeInfo[$wmiVolumeSerial]["volumeDirectoryName"] = $wmiVolume.Name
$volumeInfo[$wmiVolumeSerial]["label"] = $wmiVolume.label
$volumeInfo[$wmiVolumeSerial]["serial"] = $wmiVolumeSerial
$volumeInfo[$wmiVolumeSerial]["capacity"] = $wmiVolume.Capacity
$volumeInfo[$wmiVolumeSerial]["freeSpace"] = $wmiVolume.FreeSpace
}
}
return $volumeInfo
}
function WMIRegistryMountedDeviceInfo{
param($computerName, $mycreds)
$MountPointRegistryInformation = @{}
$hklm = 2147483650
$registryKeyMountedDevices = "SYSTEM\MountedDevices"
$regexMountPoint = ".*{(.*)}.*"
$wmi = get-wmiobject -list "StdRegProv" -namespace root\default -computername $computerName -credential $mycreds
$wmiMountedDeviceKey = ($wmi.EnumValues($hklm,$registryKeyMountedDevices))
foreach($mountedDeviceRegistryName in $wmiMountedDeviceKey.sNames){
if($mountedDeviceRegistryName -match $regexMountPoint){
$wmiValue = ($wmi.GetBinaryValue($hklm,$registryKeyMountedDevices,$mountedDeviceRegistryName))
if($wmiValue.uValue.Count -eq 12){
$diskDriveSignature = [bitconverter]::ToUInt32($wmiValue.uValue[0..3],0)
$diskPartitionStartingOffset = [bitconverter]::ToUInt64($wmiValue.uValue[4..11],0)
$MountPointRegistryInformation[$Matches[1]]=@{"serial"=$Matches[1];
"mountedDeviceRegistryName"=$mountedDeviceRegistryName;
"diskDriveSignature"=$diskDriveSignature;
"diskPartitionStartingOffset"=$diskPartitionStartingOffset;
"wmiValue"=$wmiValue.uValue}
}
}
}
return $MountPointRegistryInformation
}
Этот код должен возвращать каждую подпись хэш-таблице с подписью диска, связанной с mountDevice. Он также возвращает DiskPartitionStartingOffset, который будет тем же, что и partition.StartingOffset, связанный с mountDevice.
Если вы хотите написать код самостоятельно, первые 4 байта этого значения реестра SYSTEM \ MountingDevices являются сигнатурой диска, но будьте осторожны с прямым порядком байтов. Следующие 8 байтов являются PartitionStartingOffset.
С помощью этой информации вы можете использовать WMI для получения информации о жестких дисках и подключать все вместе, чтобы действительно получить весь том, связанный со всеми имеющимися у вас физическими дисками, независимо от того, как они смонтированы.
Это не работает для объединенного тома.
Будьте очень осторожны при игре в такого рода реестре.