Como mapear qual volume reside em qual partição no Windows?

5

Problema: Eu preciso descobrir qual volume corresponde a qual (is) partição (ões) corresponde (m) a qual disco em uma manufatura capaz de script extremamente eficiente. Eu sei como corresponder qual partição corresponde a qual disco porque o ID do disco está diretamente nos resultados de uma consulta wmic simples. No entanto, a primeira parte do problema é mais difícil. Como correlacionar qual volume pertence a quais partições?

Existe uma maneira, usando o wmic, o PowerShell, o prompt do cmd, fazer engenharia reversa de qual volume mapeia para quais partições funciona em todas as versões atualmente suportadas do Windows Server (Windows Server 2008 R2 - Windows Server 2016)?

Se sim, como seria essa consulta?

Usar o diskpart para obter informações NÃO é uma opção. Embora possa ser usado para fazer o script de operações de disco, é terrível usar o diskpart como uma ferramenta para retornar informações sobre configurações de disco. A saída do Diskpart NÃO é analisável.

    
por Rusty Weber 28.09.2016 / 22:49

2 respostas

1

Uma solução possível é o seguinte script de shell de energia. A saída deve estar no formato JSON. O problema com essa solução é que ela depende do cmdlet get-partition. Este cmdlet foi introduzido após o Windows 2008R2. Isso funcionaria como uma solução se o cmdlet get-partition fosse portado para o Windows 2008R2 ou se eu encontrasse uma solução que faria a mesma coisa no Windows 2008R2. Embora não seja uma solução completa, não se encaixou como comentário.

$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
        "}"
    
por 28.09.2016 / 23:02
0

Atualmente, não posso postar comentários, mas isso parece muito próximo de uma solução para você. Eu encontrei documentação do WMI Tasks intitulado "... detectar qual letra de unidade está associada a uma partição de disco lógico?" em VBScript.

Por favor note: Eu não sou de forma alguma versado em VBScript, então eu não posso falar sobre quão versátil e modificável é o método abaixo, mas eu acredito que ele tenha todas as informações necessárias para modificar um novo script que é analisável em um formato ao seu gosto.

Fonte: link

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

Quando eu testo esse script, recebo todas as informações solicitadas em WScript.Echo caixas de diálogo. Por exemplo, no meu sistema, a caixa de diálogo mostra: Saída de caixa de diálogo do VBScript

    
por 05.10.2016 / 17:26