Tarefas WMI: discos e sistemas de arquivos

As tarefas do WMI para discos e sistemas de arquivos obtêm informações sobre o estado do hardware da unidade de disco e os volumes lógicos. Para obter outros exemplos, consulte o TechNet ScriptCenter em https://www.microsoft.com/technet.

Os exemplos de script mostrados neste tópico obtêm dados somente do computador local. Para obter mais informações sobre como usar o script para obter dados de computadores remotos, confira Como conectar-se ao WMI em um computador remoto.

O procedimento a seguir descreve como executar um script.

Para executar um script

  1. Copie o código e salve-o em um arquivo com a extensão .vbs, por exemplo, nomedoarquivo.vbs. Verifique se o editor de texto não adicionou a extensão .txt ao arquivo.
  2. Abra uma janela do prompt de comando e navegue até o diretório no qual deseja salvar o arquivo.
  3. Digite cscript nomedoarquivo.vbs no prompt de comando.
  4. Se você não conseguir acessar um log de eventos, verifique se está executando a partir de um prompt de comandos com privilégios elevados. Alguns logs de eventos, como o Log de Eventos de Segurança, podem ser protegidos por UAC (Controles de Conta de Usuário).

Observação

Por padrão, o cscript exibe a saída de um script na janela do prompt de comando. Como os scripts do WMI podem gerar uma grande quantidade de saída, pode ser interessante redirecionar essa saída para um arquivo. Digite cscript nomedoarquivo.vbs > arquivodesaida.txt no prompt de comando para redirecionar a saída do script nomedoarquivo.vbs para arquivodesaida.txt.

A tabela a seguir lista exemplos de script que podem ser usados para obter diversos tipos de dados do computador local.

Como fazer... Classes ou métodos WMI
... para descobrir quanto espaço em disco cada usuário está usando em um computador? Se você estiver usando cotas de disco, use a classe Win32_DiskQuota e recupere os valores das propriedades User e 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
}
... para determinar quando uma unidade removível foi adicionada ou removida de um computador?

Use um script de monitoramento que consulta a classe 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
... para determinar se um CD está em uma unidade de CD-ROM?

Use a classe Win32_CDROMDrive e a propriedade 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
}
... para determinar se um disco está na unidade de disquete?

Use a classe Win32_LogicalDisk e verifique a propriedade FreeSpace. Se o valor for Null, nenhum disco estará na unidade.

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." } }

... para distinguir entre um disco rígido fixo e um disco rígido removível?

Use a classe Win32_LogicalDisk e verifique o valor da propriedade 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." } } }

... para determinar qual sistema de arquivos está em uso em uma unidade?

Use a classe Win32_LogicalDisk e a propriedade 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
... para determinar quanto espaço livre está disponível em uma unidade?

Use a classe Win32_LogicalDisk e a propriedade 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
...para determinar o tamanho de uma unidade?

Use a classe Win32_LogicalDisk e a propriedade 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
... para descobrir quais unidades são mapeadas em um computador?

Use a classe 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
... oara desfragmentar um disco rígido?

Use a classe Win32_Volume e o método 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
... para detectar qual letra da unidade está associada a uma partição de disco lógico?
  1. Comece com a classe Win32_DiskDrive e consulte instâncias de Win32_DiskPartition usando a propriedade DeviceID e a classe de associação Win32_DiskDriveToDiskPartition . Agora, você tem uma coleção das partições na unidade física.
  2. Consulte a Win32_LogicalDisk que representa a partição usando a propriedade Win32_DiskPartition.DeviceID e a classe de associação Win32_LogicalDiskToPartition.
  3. Obtenha a letra da unidade do Win32_LogicalDisk.DeviceID.

VB
              
              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

Tarefas do WMI para scripts e aplicativos

Exemplos de aplicativo C++ do WMI

TechNet ScriptCenter

`