web-dev-qa-db-ja.com

Windowsのどのパーティションにどのボリュームが存在するかをマップする方法は?

問題:非常に効率的なスクリプト可能なマナーで、どのボリュームがどのパーティションに対応し、どのディスクに対応するかを把握する必要があります。ディスクIDは単純なwmicクエリの結果に直接含まれているため、どのパーティションがどのディスクに対応するかを対応させる方法を知っています。ただし、問題の最初の部分はより困難です。どのボリュームがどのパーティションに属しているかを関連付ける方法は?

Wmic、PowerShell、cmd Promptを使用して、現在サポートされているすべてのバージョンのWindows Server(Windows Server 2008R2-Windows Server 2016)で機能する、どのボリュームがどのパーティションにマップされるかをリバースエンジニアリングする方法はありますか?

もしそうなら、このクエリはどのように見えますか?

Diskpartを使用して情報を取得することはオプションではありません。ディスク操作のスクリプトを作成するために使用できますが、diskpartをディスク構成に関する情報を返すツールとして使用するのはひどいことです。 Diskpartの出力は解析できません。

5
Rusty Weber

考えられる解決策の1つは、次のパワーシェルスクリプトです。出力はJSON形式である必要があります。このソリューションの問題は、get-partitionコマンドレットに依存していることです。このコマンドレットは、Windows2008R2の後に導入されました。これは、get-partitionコマンドレットをWindows 2008R2に移植する場合、またはWindows2008R2で同じことを行うソリューションを見つけた場合のソリューションとして機能します。完全な解決策ではありませんが、コメントとしては適合しませんでした。

$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
        "}"
1
Rusty Weber

現在コメントを投稿することはできませんが、これはあなたにとっての解決策に非常に近いようです。 「...どのドライブ文字が論理ディスクパーティションに関連付けられているかを検出しますか?」というタイトルのWMIタスクのドキュメントを見つけました。 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ダイアログ出力

0
Aaron St. Clair