次のエラーを報告しているWindows2008R2サーバーがあります。
ディスク上のファイルシステム構造が破損していて使用できません。ボリュームでchkdskユーティリティを実行してください\ Device\HarddiskVolume2。
PowershellとWMIを使用して、Win32_Volume
をクエリするときに、どのボリュームであるかを特定するにはどうすればよいですか。
たとえば、私がそうする場合:
Get-WmiObject Win32_Volume
サーバー上のすべてのボリュームのリストを取得しましたが、Win32_Volume
クラスプロパティのいずれも、この「わかりやすい」名前--\Device\HarddiskVolume2
を使用していません(表示されます)。次のような値を返すDeviceID
プロパティがあることがわかります。
DeviceID : \\?\Volume{4bc3df2a-65c7-11e0-9c33-806e6f6e6963}\
Name
プロパティもありますが、これはボリュームに割り当てられたドライブ文字です。他のプロパティには、イベントログで報告されたものにリモートで似た値はありません。
fltmc volumes
またはDISKPART
からの出力を解析してこの情報を取得できることはわかっていますが、PowerShellスクリプトでWMIを使用してこれを取得する方法が必要です。
Win32_DiskDrive
、Win32_DiskPartition
、およびWin32_LogicalDisk
クラスも調べましたが、\Device\HarddiskVolume2
に似たプロパティ値については言及されていません。
このコードを見てみましょう: http://poshcode.org/4768 必要な変換を実行しているように見えるので、必要に応じて微調整して、それについて助けが必要かどうかはわかりますが、自分で理解できると思います。
function Get-DevicePath
{
<#
.SYNOPSIS
Returns the device paths for each volume.
Author: Matthew Graeber (@mattifestation)
License: BSD 3-Clause
.DESCRIPTION
Get-DevicePath returns the corresponding device path for each drive letter. This is useful for converting device paths to drive letters.
.EXAMPLE
Get-DevicePath
DevicePath DriveLetter
---------- -----------
\Device\HarddiskVolume2 D:
\Device\HarddiskVolume4 C:
.OUTPUTS
PSObject[]
For each mount point, a PSObject is returned representing the drive letter and device path.
#>
# Utilize P/Invoke in order to call QueryDosDevice. I prefer using
# reflection over Add-Type since it doesn't require compiling C# code.
$DynAssembly = New-Object System.Reflection.AssemblyName('SysUtils')
$AssemblyBuilder = [AppDomain]::CurrentDomain.DefineDynamicAssembly($DynAssembly, [Reflection.Emit.AssemblyBuilderAccess]::Run)
$ModuleBuilder = $AssemblyBuilder.DefineDynamicModule('SysUtils', $False)
# Define [Kernel32]::QueryDosDevice method
$TypeBuilder = $ModuleBuilder.DefineType('Kernel32', 'Public, Class')
$PInvokeMethod = $TypeBuilder.DefinePInvokeMethod('QueryDosDevice', 'kernel32.dll', ([Reflection.MethodAttributes]::Public -bor [Reflection.MethodAttributes]::Static), [Reflection.CallingConventions]::Standard, [UInt32], [Type[]]@([String], [Text.StringBuilder], [UInt32]), [Runtime.InteropServices.CallingConvention]::Winapi, [Runtime.InteropServices.CharSet]::Auto)
$DllImportConstructor = [Runtime.InteropServices.DllImportAttribute].GetConstructor(@([String]))
$SetLastError = [Runtime.InteropServices.DllImportAttribute].GetField('SetLastError')
$SetLastErrorCustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($DllImportConstructor, @('kernel32.dll'), [Reflection.FieldInfo[]]@($SetLastError), @($true))
$PInvokeMethod.SetCustomAttribute($SetLastErrorCustomAttribute)
$Kernel32 = $TypeBuilder.CreateType()
$Max = 65536
$StringBuilder = New-Object System.Text.StringBuilder($Max)
Get-WmiObject Win32_Volume | ? { $_.DriveLetter } | % {
$ReturnLength = $Kernel32::QueryDosDevice($_.DriveLetter, $StringBuilder, $Max)
if ($ReturnLength)
{
$DriveMapping = @{
DriveLetter = $_.DriveLetter
DevicePath = $StringBuilder.ToString()
}
New-Object PSObject -Property $DriveMapping
}
}
}
これがあなたが探している種類の答えであるかどうかはわかりませんが、このデータがウィンドウに非常によく表示されているようには見えませんが、コマンドラインから見ることができます。 diskpartからデータを引き出して情報を表示しようとしましたが、デバイス名が表示されませんでした。ちなみに、get-volume、get-disk、get-physicaldiskなどのディスクコマンドが2012に追加されたようですが、2008では役に立ちません。
いくつかのサードパーティユーティリティがそれを行います
どちらのユーティリティにもコマンドラインオプションがあるため、PowerShellスクリプトで使用できるはずです。