Проблема: мне нужно выяснить, какой том соответствует тому разделу (разделам), который соответствует какому диску в чрезвычайно эффективном поместье с возможностью сценариев. Я знаю, как определить, какой раздел соответствует какому диску, потому что идентификатор диска находится непосредственно в результатах простого запроса wmic. Однако первая часть проблемы более сложная. Как соотнести, какой том к каким разделам принадлежит?
Есть ли способ, используя wmic, PowerShell, cmd, перепроектировать, какой том сопоставлен с каким разделом (ами), который работает во всех поддерживаемых в настоящее время версиях Windows Server (Windows Server 2008R2 - Windows Server 2016)?
Если да, то как бы выглядел этот запрос?
Использование diskpart для получения информации НЕ вариант. Хотя его можно использовать для написания сценариев дисковых операций, использовать diskpart в качестве инструмента для возврата информации о конфигурациях дисков ужасно. Вывод Diskpart НЕ анализируется.
Одно из возможных решений - это следующий скрипт Power Shell. Вывод должен быть в формате JSON. Проблема с этим решением в том, что оно полагается на командлет get-partition. Этот командлет был представлен после Windows 2008R2. Это могло бы работать как решение, если бы командлет get-partition был перенесен на Windows 2008R2, или если бы я нашел решение, которое будет делать то же самое в Windows 2008R2. Хотя это и не полное решение, оно не подходило для комментариев.
$CimPartInfo = get-partition
"{"
foreach ($CimPart in $CimPartInfo) {
if ($CimPart.Guid -eq $null) {
$PartGUID = [regex]::match($CimPart.AccessPaths, 'Volume({[^}]+})').Groups[1].Value
}
else {
$PartGUID = $CimPart.Guid
}
"`"$PartGUID`": {"
"`"DiskId`": $($CimPart.DiskNumber),"
"`"PartitionId`": $($CimPart.PartitionNumber),"
"`"Type`": `"$($CimPart.Type)`","
"`"Size`": $($CimPart.Size),"
"`"Offset`": $($CimPart.Offset),"
"`"GUID`": `"$($CimPart.Guid)`","
$x = $CimPart.IsBoot
"`"Bootable`": $($x.ToString().ToLower()),"
"`"Status`": `"$($CimPart.OperationalStatus)`""
if ($CimPart -eq $CimPartInfo[-1]){ "}"}
else {"},"}
} #foreach CimPart
"}"
В настоящее время я не могу публиковать комментарии, однако это кажется вам очень близким к решению. Я нашел документацию из WMI Tasks под названием «... определить, какая буква диска связана с логическим разделом диска?» в VBScript.
Пожалуйста, обратите внимание: Я никоим образом не разбираюсь в VBScript, поэтому я не могу сказать, насколько универсален и модифицируем приведенный ниже метод, однако я считаю, что в нем есть вся информация, необходимая для изменения нового скрипта, который можно анализировать в формате, который вам нравится.
Источник: https://msdn.microsoft.com/en-us/library/aa394592(v=vs.85).aspx#code-snippet-11
ComputerName = "."
Set wmiServices = GetObject ( _
"winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName)
' Get physical disk drive
Set wmiDiskDrives = wmiServices.ExecQuery ( "SELECT Caption, DeviceID FROM Win32_DiskDrive")
For Each wmiDiskDrive In wmiDiskDrives
WScript.Echo "Disk drive Caption: " & wmiDiskDrive.Caption & VbNewLine & "DeviceID: " & " (" & wmiDiskDrive.DeviceID & ")"
'Use the disk drive device id to
' find associated partition
query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _
& wmiDiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
Set wmiDiskPartitions = wmiServices.ExecQuery(query)
For Each wmiDiskPartition In wmiDiskPartitions
'Use partition device id to find logical disk
Set wmiLogicalDisks = wmiServices.ExecQuery _
("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _
& wmiDiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
For Each wmiLogicalDisk In wmiLogicalDisks
WScript.Echo "Drive letter associated" _
& " with disk drive = " _
& wmiDiskDrive.Caption _
& wmiDiskDrive.DeviceID _
& VbNewLine & " Partition = " _
& wmiDiskPartition.DeviceID _
& VbNewLine & " is " _
& wmiLogicalDisk.DeviceID
Next
Next
Next
Когда я тестирую этот скрипт, я получаю всю запрошенную информацию в WScript.Echo
диалоги. Например, в моей системе диалоговое окно показывает: Вывод диалогового окна VBScript