Tra i vari tools messi a disposizione dal Framework .NET vi è anche il Management Strongly Typed Class Generator che permette di generare rapidamente una classe managed fortemente tipizzata di facile utilizzo per una specifica classe WMI semplificando il codice necessario per accedere ad un'istanza della classe WMI.
Creazione di una classe fortemente tipizzata tramite mgmtclassgen
Per generare un file C:\WMI\LogicalDisk.vb contenente la classe LogicalDisk all'interno del namespace WMI utilizzando il linguaggio Visual Basic basterà digitare il seguente comando:
mgmtclassgen Win32_LogicalDisk /l VB /o WMI /p C:\WMI\LogicalDisk.vb
Utilizzo della classe generata tramite Mgmtclassgen
Una volta generata la classe per accedere alle informazioni di un disco logico basterà istanziare un oggetto LogicalDisk inizializzato in modo opportuno.
Nel seguente esempio si mostra come determinare la capienza volume contraddistinto dalla lettera E:.
'Creazione oggetto WMI tipizzato
Dim path As New System.Management.ManagementPath("win32_LogicalDisk.DeviceId=""E:""")
Dim disk As New WMI.LogicalDisk(path)
Debug.WriteLine("Size=" & disk.Size.ToString)
'Rilascio risorse
path = Nothing
disk.Dispose() : disk = Nothing
Utilizzo della collezione generata tramite Mgmtclassgen
Nel caso sia necessario accedere ad alcune proprietà di tutti i volumi di rete si potrà istanziare una collezione LogicalDiskCollections che per ridurre i tempi di ricerca verrà inizializzata in modo da selezionare solo le proprietà desiderate (Name,Size,PrividerName) dei dischi logici di rete (DriveType=4).
'Selezione delle sole proprietà necessarie per ridurre i tempi della query WMI
Dim condition As String = "DriveType=4"
Dim properties() As String = {"Name", "Size", "ProviderName"}
'Recupero istanze selezionate
Dim networkDrives As WMI.LogicalDisk.LogicalDiskCollection
networkDrives = WMI.LogicalDisk.GetInstances(condition, properties)
'Ciclo lettura istanze
Dim index As Integer = 1
For Each networkDrive As WMI.LogicalDisk In networkDrives
Debug.WriteLine("Network Drive " & index)
Debug.Indent()
Debug.WriteLine("Name=" & networkDrive.Name)
Debug.WriteLine("Size=" & networkDrive.Size.ToString & " byte")
Debug.WriteLine("Network path=" & networkDrive.ProviderName)
Debug.Unindent()
index += 1
Next
'Rilascio risorse
networkDrives = Nothing
Conclusioni
Per le varie opzioni a riga di comando del tool Mgmtclassgen si faccia riferimento alla guida in linea o a Msdn:
Management Strongly Typed Class Generator (Mgmtclassgen.exe)
Si noti che leggere tutte le informazioni di una classe WMI richiede un certo tempo, quindi nei casi in cui le informazioni necessarie sono una minima parte delle proprietà della classe WMI e non è indispensabile l'utilizzo di una classe fortemente tipizzata conviene ricorrere ad una query WMI mirata.