WMI タスク:ディスクとファイル システム

ディスクとファイル システムの WMI タスクは、ディスク ドライブのハードウェアの状態と論理ボリュームに関する情報を取得します。 その他の例については、「TechNet ScriptCenter https://www.microsoft.com/technet」を参照してください。

このトピックに示すスクリプトの例では、ローカル コンピューターからのみデータを取得します。 スクリプトを使用してリモート コンピューターからデータを取得する方法の詳細については、「リモート コンピューター 上の WMI への接続」を参照してください。

次の手順では、スクリプトを実行する方法について説明します。

スクリプトを実行するには

  1. コードをコピーし、拡張子が .vbs のファイル ( filename.vbsなど) に保存します。 テキスト エディターでファイルに.txt拡張子が追加されていないことを確認します。
  2. コマンド プロンプト ウィンドウを開き、ファイルを保存したディレクトリに移動します。
  3. コマンド プロンプトで 「cscript filename.vbs 」と入力します。
  4. イベント ログにアクセスできない場合は、管理者特権のコマンド プロンプトから実行しているかどうかを確認します。 セキュリティ イベント ログなどの一部のイベント ログは、ユーザー アクセス制御 (UAC) によって保護される場合があります。

Note

既定では、cscript はコマンド プロンプト ウィンドウにスクリプトの出力を表示します。 WMI スクリプトでは大量の出力が生成される可能性があるため、出力をファイルにリダイレクトすることが必要になる場合があります。 コマンド プロンプト で「cscript filename.vbs > outfile.txt 」と入力して 、filename.vbs スクリプトの出力を outfile.txtにリダイレクトします。

次の表に、ローカル コンピューターからさまざまな種類のデータを取得するために使用できるスクリプトの例を示します。

操作方法 WMI クラスまたはメソッド
...各ユーザーが現在コンピューターで使用しているディスク領域の量を確認してください。 ディスク クォータを使用している場合は、 Win32_DiskQuota クラスを使用し、 User プロパティと DiskSpaceUsed プロパティの値を取得します。
VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colQuotas = objWMIService.ExecQuery ("Select * from Win32_DiskQuota")
For each objQuota in colQuotas
    Wscript.Echo "Volume: "& vbTab &  objQuota.QuotaVolume
    Wscript.Echo "User: "& vbTab &  objQuota.User      
    Wscript.Echo "Disk Space Used: " & vbTab &  objQuota.DiskSpaceUsed
Next
PowerShell
$strComputer = "."
$colItems = Get-WmiObject -Class Win32_DiskQuota -ComputerName $strComputer
foreach ($objQuota in $colItems) 
{ 
    "Volume: " + $objQuota.QuotaVolume
    "User: " + $objQuota.User      
    "Disk Space Used: " + $objQuota.DiskSpaceUsed
}
...リムーバブル ドライブがコンピューターに追加されたか、コンピューターから削除されたかを判断する

Win32_VolumeChangeEvent クラスに対してクエリを実行する監視スクリプトを使用します。

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colMonitoredEvents = objWMIService. ExecNotificationQuery( "Select * from Win32_VolumeChangeEvent")
Do
    Set objLatestEvent = colMonitoredEvents.NextEvent
    Wscript.Echo objLatestEvent.DriveName
    Wscript.Echo objLatestEvent.EventType
    Wscript.Echo objLatestEvent.Time_Created
Loop
...CD が CD-ROM ドライブにあるかどうかを判断する

Win32_CDROMDrive クラスと MediaLoaded プロパティを使用します。

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery( "Select * from Win32_CDROMDrive")
For Each objItem in colItems
    Wscript.Echo "Device ID: " & objItem.DeviceID
    Wscript.Echo "Media Loaded: " & objItem.MediaLoaded
Next
PowerShell
$strComputer = "."
$colItems = Get-WmiObject -Class Win32_CDROMDrive -ComputerName $strComputer
foreach ($objItem in $colItems)
{
    "Device ID: " + $objItem.DeviceID
    "MediaLoaded: " + $objItem.MediaLoaded
}
...ディスクがフロッピー ドライブにあるかどうかを判断する

Win32_LogicalDisk クラスを使用し、FreeSpace プロパティを確認します。 値が Null の場合、ディスクはドライブにありません。

VB
strComputer = "."Set objWMIService = GetObject( "winmgmts:\\" & strComputer & "\root\cimv2") Set colItems = objWMIService.ExecQuery ("Select * From Win32_LogicalDisk Where DeviceID = 'A:'")

For Each objItem in colItems intFreeSpace = objItem.FreeSpace If IsNull(intFreeSpace) Then Wscript.Echo "There is no disk in the floppy drive." Else Wscript.Echo "There is a disk in the floppy drive." End If Next

PowerShell
$strComputer = "." $colItems = Get-WmiObject -Class Win32_LogicalDisk -Namespace "root\cimv2" -ComputerName $strComputer |' Where-Object { $_.DeviceID -eq "A:" }

foreach ($objItem in $colItems) { $intFreeSpace = $objItem.FreeSpace if ($intFreeSpace -eq $null) { "There is no disk in the floppy drive." } else { "There is a disk in the floppy drive." } }

...固定ハード ディスクとリムーバブル ハード ディスクを区別する

Win32_LogicalDisk クラスを使用し、DriveType プロパティの値を確認します。

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery _
    ("Select * from Win32_LogicalDisk")
For Each objDisk in colDisks
    Wscript.Echo "DeviceID: "& vbTab _
        &  objDisk.DeviceID       
    Select Case objDisk.DriveType
        Case 1
            Wscript.Echo "No root directory. " & "Drive type could not be " & "determined."
        Case 2
            Wscript.Echo "DriveType: "& vbTab &  "Removable drive."
        Case 3
            Wscript.Echo "DriveType: "& vbTab &  "Local hard disk."
        Case 4
            Wscript.Echo "DriveType: "& vbTab &  "Network disk."      
        Case 5
            Wscript.Echo "DriveType: "& vbTab &  "Compact disk."      
        Case 6
            Wscript.Echo "DriveType: "& vbTab &  "RAM disk."   
        Case Else
            Wscript.Echo "Drive type could not be" & " determined."
    End Select
Next

PowerShell
$strComputer = "." $colDisks = Get-WmiObject -Class Win32_LogicalDisk -ComputerName $strComputer

foreach ($objDisk in $colDisks) { "DeviceID: " + $objDisk.deviceID switch ($objDisk.DriveType) { '1' { "No root directory. Drive type could not be determined." } '2' { "DriveType: Removable drive." } '3' { "DriveType: Local hard disk." } '4' { "DriveType: Network disk." } '5' { "DriveType: Compact disk." } '6' { "DriveType: RAM disk." } default: { "Drive type could not be determined." } } }

...ドライブで使用されているファイル システムを特定する

Win32_LogicalDisk クラスと FileSystem プロパティを使用します。

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk")
For Each objDisk in colDisks
    Wscript.Echo "DeviceID: " & objDisk.DeviceID       
    Wscript.Echo "File System: " & objDisk.FileSystem
Next
...ドライブで使用可能な空き領域の量を決定します。

Win32_LogicalDisk クラスと FreeSpace プロパティを使用します。

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk")
For Each objDisk in colDisks
    Wscript.Echo "DeviceID: " & objDisk.DeviceID       
    Wscript.Echo "Free Disk Space: " & objDisk.FreeSpace
Next
...ドライブのサイズを決定しますか?

Win32_LogicalDisk クラスと Size プロパティを使用します。

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colDisks = objWMIService.ExecQuery ("Select * from Win32_LogicalDisk")
For Each objDisk in colDisks
    Wscript.Echo "DeviceID: " & objDisk.DeviceID       
    Wscript.Echo "Disk Size: " & objDisk.Size
Next
...コンピューターにマップされているドライブを確認する

Win32_MappedLogicalDisk クラスを使用します。

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colDisks = objWMIService. ExecQuery("Select * from Win32_MappedLogicalDisk")
For Each objDisk in colDisks
    Wscript.Echo "Device ID: " & objDisk.DeviceID
    Wscript.Echo "Name: " & objDisk.Name
    Wscript.Echo "Free Space: " & objDisk.FreeSpace
    Wscript.Echo "Size: " & objDisk.Size
Next
...ハード ディスクを最適化しますか?

Win32_Volume クラスと Defrag メソッドを使用します。

VB
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colVolumes = objWMIService.ExecQuery ("Select * from Win32_Volume Where Name = 'K:\\'")
For Each objVolume in colVolumes
     errResult = objVolume.Defrag()
Next
...論理ディスク パーティションに関連付けられているドライブ文字を検出する
  1. Win32_DiskDrive クラスから開始し、DeviceID プロパティとWin32_DiskDriveToDiskPartition関連付けクラスを使用して、Win32_DiskPartitionのインスタンスに対してクエリを実行します。 これで、物理ドライブ上のパーティションのコレクションが作成されました。
  2. Win32_DiskPartition.DeviceID プロパティとWin32_LogicalDiskToPartition関連付けクラスを使用して、パーティションを表すWin32_LogicalDiskのクエリを実行します。
  3. Win32_LogicalDisk.DeviceID からドライブ文字を取得します。

VB
ComputerName = "."Set wmiServices = GetObject ( _ "winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName) ' 物理ディスク ドライブの取得 wmiDiskDrives = wmiServices.ExecQuery ( "SELECT Caption, DeviceID FROM Win32_DiskDrive")

WmiDiskDrives WScript.Echo の各 wmiDiskDrive の "ディスク ドライブ キャプション: " & wmiDiskDrive.Caption & VbNewLine & "DeviceID: " & "(" & wmiDiskDrive.DeviceID & ")"

'ディスク ドライブのデバイス ID を使用して' 関連するパーティション クエリを検索する = "ASSOCIATEDORS 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

スクリプトとアプリケーションの WMI タスク

WMI C++ アプリケーションの例

TechNet ScriptCenter

`