Uso de WMI desde Vb.NET

[Acceso a propiedades a bajo nivel]

 

Fecha: 15/Ago/2005 (14/08/05)
Autor: Juan Antonio Lobón [email protected]

 


Estimados desarrolladores a continuación describo algunas rutinas y detalles en el mundo de WMI aplicado a .NET

En este artículo veremos la forma de generar clases fuertemente tipadas para manejar objetos de WMI y como usarlas.

La utilidad Mgmtclassgen.exe
Esta utilidad la podéis usar desde el la venta de comandos de Visual Studio y su propósito es generar clases para el uso de los objetos WMI, por ejemplo podríamos generarnos una clase/componente para la interacción con el disco lógico:
"mgmtclassgen Win32_LogicalDisk /n root\cimv2 /l VB /p c:\disk.vb"

Esta sentencia generaría una clase en el espacio de nombres ROOT.CIMV2.Win32 llamada LogicalDrives  o podríamos cambiar W32_LogicalDisck por Win32_NetworkAdapterConfiguration ó Win32_DiskDrive con resultados Clase para interacción con la clase WMI de adaptador de red y dispositivo de almacenamiento respectivamente.

Uso de la Utilidad en nuestro proyecto:

  1. Generamos la clase que necesitamos
  2. La incluimos en nuestro proyecto
  3. La instanciamos para el uso que queremos darle.

Public Function Disco() As String
    Dim str As String

Try
   
Dim dL As New ROOT.CIMV2.Win32.LogicalDisk(New  ManagementPath("win32_LogicalDisk.DeviceId=""c:"""))

    str &= vbNewLine & "DISCO LOGICO............."
    str = dL.Name & "->" & dL.VolumeSerialNumber
    str &= vbNewLine & dL.Name & "->" & dL.DeviceID
    str &= vbNewLine & dL.Name & "->" & dL.DriveType
    str &= vbNewLine & dL.Name & "->" & dL.FileSystem
    str &= vbNewLine & dL.Name & "->" & dL.PNPDeviceID
    str &= vbNewLine & dL.Name & "->" & dL.ProviderName
    str &= vbNewLine & dL.Name & "->" & dL.Status
    str &= vbNewLine & dL.Name & "->" & dL.SystemCreationClassName
    str &= vbNewLine & dL.Name & "->" & dL.SystemProperties.CLASS
    str &= vbNewLine & dL.Name & "->" & dL.SystemProperties.DERIVATION(0)
    str &= vbNewLine & dL.Name & "->" & dL.SystemProperties.DYNASTY
    str &= vbNewLine & dL.Name & "->" & dL.SystemProperties.GENUS
    str &= vbNewLine & dL.Name & "->" & dL.SystemProperties.NAMESPACE
    str &= vbNewLine & dL.Name & "->" & dL.SystemProperties.PATH
    str &= vbNewLine & dL.Name & "->" & dL.SystemProperties.RELPATH
    str &= vbNewLine & dL.Name & "->" & dL.SystemProperties.SERVER
    str &= vbNewLine & dL.Name & "->" & dL.SystemProperties.SUPERCLASS

Catch ex As System.Exception
    str = "Error: " & Err.Description
End Try
    Return str
End Function

 

Esta función llenaría el string con los pares "nombre -> valor" que hemos seleccionado, pero podríamos haber seleccionado otros...

Uso de consultas WMI para recuperar.

Public Function ExecuteWQLQuery(ByVal strWQL As String) As String
' Crear la consulta
Dim str As String
Try
    Dim mySelect As New SelectQuery(strWQL)
   
' Inicializar el buscador con la query
   
Dim myResults As New ManagementObjectSearcher(mySelect)
   
Dim myProperty As PropertyData
   
Dim wmiObject As Object
   
' Recorrer la colección

    For Each wmiObject In myResults.Get()
       
' Imprir
       
For Each myProperty In wmiObject.Properties
            str &= vbNewLine & myProperty.Name & "->" & Convert.ToString(myProperty.Value)
       
Next
    Next
wmiObject

Catch ex As System.Exception
    str = "Error: " & ex.Message
End Try
    Return
str
End Function


Espero que este código os ayude a profundizar en el tema.
Saludos Juan Antonio Lobón

 


Espacios de nombres usados en el código de este artículo:

System.
System.Management
 


Fichero con el código de ejemplo: juanlosa_EjemploWMI.zip - 22 KB


ir al índice