2017-12-01 19 views
0

Windowsボリュームのドライブ文字に関連付けられたPowerShell Get-Diskコマンドレットから返されたシリアル番号のようなシリアル番号を取得したいと考えています。私はこれを行う方法の正しい方向に私を指し示すものを見つけるためにstruglingしています。私は人々がvbscriptとc#から呼び出されたWMIクエリを介してこれを現場で行うことができたことがわかります。ドライブ文字からディスクシリアル番号を取得

private string GetDiskIndex(string driveLetter) 
    { 
     driveLetter = driveLetter.TrimEnd('\\'); 

     ManagementScope scope = new ManagementScope(@"\root\cimv2"); 
     var drives = new ManagementObjectSearcher(scope, new ObjectQuery("select * from Win32_DiskDrive")).Get(); 
     foreach(var drive in drives) 
     { 

      var partitions = new ManagementObjectSearcher(scope, new ObjectQuery("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + drive["DeviceID"] + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")).Get(); 
      foreach(var partition in partitions) 
      { 
       var logicalDisks = new ManagementObjectSearcher(scope, new ObjectQuery("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + partition["DeviceID"] + "'} WHERE AssocClass = Win32_LogicalDiskToPartition")).Get(); 
       foreach (var logicalDisk in logicalDisks) 
       { 
        if (logicalDisk["DeviceId"].ToString() == driveLetter) return partition["DiskIndex"].ToString(); 
       } 
      } 

     } 

     return null; 
    } 

これを行うには、エレガントな方法がありますか?

答えて

1

WMI/CIMはpowershellでも実行できます。しかし、あなたも行うことができます。

get-partition -DriveLetter C | get-disk 
+1

Windows 7では、FYIとして 'Get-Disk'を利用できません。 – TheIncorrigible1

-1

はこれを試してみてください:

$drive_serialnumber = Get-Partition -DriveLetter C | Get-Disk | select-object -ExpandProperty SerialNumber 
$drive_serialnumber.trim() 

使用して空白を削除するトリム。

1

CIMコマンドレットを使用してコードを複製することが非常にシンプル:

$DriveLetter = 'C:' 

Get-CimInstance -ClassName Win32_DiskDrive | 
    Get-CimAssociatedInstance -Association Win32_DiskDriveToDiskPartition | 
    Get-CimAssociatedInstance -Association Win32_LogicalDiskToPartition | 
    Where-Object DeviceId -eq $DriveLetter | 
    Get-CimAssociatedInstance -Association Win32_LogicalDiskToPartition | 
    Select-Object -Property DiskIndex 

あなただけDiskIndexのベース符号なし整数値をしたい場合は、代わりに-ExpandProperty DiskIndexを使用しています。

これは、ご使用のWindowsのバージョンにGet-PartitionまたはGet-Driveがなくても、PowerShell v3.0 +をお持ちの場合に便利です。

あなたのコードでは、上記のコードが行うものであるDiskIndexが必要です。しかし、あなたの質問はSerialNumberが欲しいと言っています。それを得る方法は次のとおりです。

Get-CimInstance -ClassName Win32_DiskDrive | 
    Get-CimAssociatedInstance -Association Win32_DiskDriveToDiskPartition | 
    Get-CimAssociatedInstance -Association Win32_LogicalDiskToPartition | 
    Where-Object DeviceId -eq $DriveLetter | 
    Get-CimAssociatedInstance -Association Win32_LogicalDiskToPartition | 
    Get-CimAssociatedInstance -Association Win32_DiskDriveToDiskPartition | 
    Select-Object -Property SerialNumber 
関連する問題