VB.NET - Obtendo informações do Disco Rígido


 No artigo de hoje eu vou mostrar como podemos obter informações do disco rígido local usando os recursos dos namespaces System.Management e System.Management.Instrumentation em uma aplicação Windows Forms usando a linguagem VB .NET.


O namespace System.Management fornece acesso a um rico conjunto de informação e gestão de eventos sobre o sistema, dispositivos e aplicativos instrumentados para a infraestrutura do Windows Management Instrumentation (WMI).

Os aplicativos e serviços podem consultar informação de gestão (como a quantidade de espaço livre que resta no disco, qual a atual utilização da CPU, como o banco de dados de um determinado aplicativo está conectado, e muito mais), usando as classes derivadas de ManagementObjectSearcher e ManagementQuery ou uma variedade de eventos de gerenciamento usando a classe ManagementEventWatcher. Os dados acessíveis podem ser de componentes gerenciados e não gerenciados no ambiente distribuído.

 

O namespace System.Management.Instrumentation fornece as classes necessárias para instrumentar aplicativos para gerenciamento e expondo suas informações de gestão e eventos através do WMI aos potenciais consumidores.

Os consumidores, como o Microsoft Application Center ou Microsoft Operations Manager podem gerenciar seu aplicativo facilmente, e a monitoração e configuração do seu aplicativo estarão disponíveis para os scripts de administrador ou outras aplicações, tanto para componentes gerenciados como não gerenciados.

É muito fácil instrumentar o aplicativo usando o atributo personalizado InstrumentationClass em classes que você deseja expor.

 

Neste artigo eu vou mostrar como usar esses recursos em uma aplicação Windows forms para obter as informações do disco rígido como: o número de Série, o espaço livre, o tamanho do disco, o tipo do disco, etc.

Recursos usados:

Criando o projeto no Visual Studio 2013 Express for windows desktop

Abra o VS 2013 Express for windows desktop e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application;

Informe o nome DiscoRigido_Info e clique no botão OK;

 

Formulário principal do projeto form1.vb inclua os seguinte controles a partir da ToolBox:

Disponha os controles no formulário form1.vb conforme o leiaute abaixo:

 

Vamos agora incluir uma referência aos namespaces System.Management e System.Management.Instrumentation em nosso projeto.

No menu PROJECT clique em Add Reference e a seguir selecione os namespaces conforme abaixo e clique no botão OK;

Vamos incluir uma classe no projeto chamada DiscoRigido onde iremos definir métodos estáticos para obter as informações do disco rígido.

No menu PROJECT clique em Add Class e informe o nome DiscoRigido.

Após isso declare no início dessa classe os namespaces:

Imports System.Management

Imports System.Management.Instrumentation

A seguir vamos definir o código abaixo na classe DiscoRigido:

Public Class DiscoRigido

    Shared mo_HD As ManagementObject

    Private Shared Function DiscoInfo(ByVal strDrive As String) As ManagementObject
        'Verifica se a letra do drive foi informada. O padrão é a letra C
        If strDrive = "" OrElse strDrive Is Nothing Then
            strDrive = "C"
        End If
        Try
            'Usa Win32_LogicalDisk para obter as propriedades do HD
            Dim moHD As New ManagementObject("Win32_LogicalDisk.DeviceID=""" + strDrive + ":""")
            Return moHD
        Catch ex As Exception
            Throw
        End Try
    End Function

    Public Shared Function NumeroSerial(ByVal strDrive As String) As String
        Try
            mo_HD = DiscoInfo(strDrive)
            mo_HD.Get()
            'Pega o Serial
            Return mo_HD("VolumeSerialNumber").ToString()
        Catch ex As Exception
            Throw
        End Try
    End Function

    Public Shared Function Tamanho(ByVal strDrive As String) As Double
        Try
            mo_HD = DiscoInfo(strDrive)
            mo_HD.Get()
            'Pega o tamanho do HD
            Return Convert.ToDouble(mo_HD("Size"))
        Catch ex As Exception
            Throw
        End Try
    End Function

    Public Shared Function EspacoLivre(ByVal strDrive As String) As Double
        Try
            mo_HD = DiscoInfo(strDrive)
            mo_HD.Get()
            'Pega o espaço livre
            Return Convert.ToDouble(mo_HD("FreeSpace"))
        Catch ex As Exception
            Throw
        End Try
    End Function

    Public Shared Function TipoDrive(ByVal strDrive As String) As String
        Try
            mo_HD = DiscoInfo(strDrive)
            mo_HD.Get()
            'Pega o tipo de drive
            Return mo_HD("DriveType").ToString()
        Catch ex As Exception
            Throw
        End Try
    End Function

    Public Shared Function Sistema(ByVal strDrive As String) As String
        Try
            mo_HD = DiscoInfo(strDrive)
            mo_HD.Get()
            'Pega info do sistema
            Return mo_HD("FileSystem").ToString()
        Catch ex As Exception
            Throw
        End Try
    End Function

    Public Shared Function Modelo(ByVal strDrive As String) As String
        Try
            mo_HD = DiscoInfo(strDrive)
            mo_HD.Get()
            'Pega tipo da media
            Return mo_HD("MediaType").ToString()
        Catch ex As Exception
            Throw
        End Try
    End Function
End Class

Neste código temos 6 métodos estáticos(Shared) que podem ser usados para obter a informação sobre um dispositivo instalado no computador local.

Todos esses métodos usam o método privado DiscoInfo() que retorna um objeto do tipo ManagementObject contendo as propriedades do dispositivo indicado e a seguir extraem a informação específica usando a classe Win32_LogicalDisk que representa uma fonte de dados que resolve para um verdadeiro dispositivo de armazenamento local em um sistema de computador com a plataforma Windows.

Para usar essa classe vamos definir no formulário form1.vb o código em cada evento Click dos botões de comando.

A seguir temos o código do formulário:

Imports System.Management
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        cboDrive.SelectedIndex = 2
    End Sub

    Private Sub btnSerial_Click(sender As Object, e As EventArgs) Handles btnSerial.Click
        If cboDrive.SelectedIndex <> -1 Then
            Try
                lblInfo.Text = "Serial : " & DiscoRigido.NumeroSerial(cboDrive.Text).ToString
            Catch ex As Exception
                lblInfo.Text = "Não Disponível " & ex.Message
            End Try
        End If
    End Sub

    Private Sub btnEspacoLivre_Click(sender As Object, e As EventArgs) Handles btnEspacoLivre.Click
        If cboDrive.SelectedIndex <> -1 Then
            Try
                Dim dblLivre As Double = 0
                'Espaço
                dblLivre = Math.Round(DiscoRigido.EspacoLivre(cboDrive.Text).ToString / 1024 / 1024 / 1024)
                'Divide 3 vezes por 1024 ( Byte ) para obter GB 
                '1 KB = 1024 - KiloByte
                '1 MB = 1024 ^ 2 - MegaByte
                '1 GB = 1024 ^ 3 - GigaByte
                '1 TB = 1024 ^ 4 - TeraByte
                '1 PB = 1024 ^ 5 - PetaByte
                '1 EB = 1024 ^ 6 - ExaByte
                '1 ZB = 1024 ^ 7 - ZettaByte
                '1 YB = 1024 ^ 8 - YottaByte
                '1 BB = 1024 ^ 9 - BrontoByte
                lblInfo.Text = "Livres : " & dblLivre.ToString() + " GB"
            Catch ex As Exception
                lblInfo.Text = "Não Disponível " & ex.Message
            End Try
        End If
    End Sub
    Private Sub btnTamanho_Click(sender As Object, e As EventArgs) Handles btnTamanho.Click
        If cboDrive.SelectedIndex <> -1 Then
            Try
                Dim dblTamanho As Double = 0
                'tamanho
                dblTamanho = Math.Round(DiscoRigido.Tamanho(cboDrive.Text).ToString / 1024 / 1024 / 1024)
                'Divide 3 vezes por 1024 ( Byte ) para obter GB
                '1 KB = 1024 - KiloByte
                '1 MB = 1024 ^ 2 - MegaByte
                '1 GB = 1024 ^ 3 - GigaByte
                '1 TB = 1024 ^ 4 - TeraByte
                '1 PB = 1024 ^ 5 - PetaByte
                '1 EB = 1024 ^ 6 - ExaByte
                '1 ZB = 1024 ^ 7 - ZettaByte
                '1 YB = 1024 ^ 8 - YottaByte
                '1 BB = 1024 ^ 9 - BrontoByte   
                lblInfo.Text = "Tamanho : " & dblTamanho.ToString & " GB"
            Catch ex As Exception
                lblInfo.Text = "Não Disponível " & ex.Message
            End Try
        End If
    End Sub
    Private Sub btnTipo_Click(sender As Object, e As EventArgs) Handles btnTipo.Click
        If cboDrive.SelectedIndex <> -1 Then
            Try
                Dim strDriveType As String = Nothing
                'determina o tipo do drive
                Select Case DiscoRigido.TipoDrive(cboDrive.Text).ToString
                    Case "0"
                        strDriveType = "Desconhecido"
                        Exit Select
                    Case "1"
                        strDriveType = "Readable"
                        Exit Select
                    Case "2"
                        strDriveType = "Writable"
                        Exit Select
                    Case "3"
                        strDriveType = "Read / Write Suportado"
                        Exit Select
                    Case "4"
                        strDriveType = "Write Once"
                End Select
                lblInfo.Text = "Tipo : " & strDriveType
            Catch ex As Exception
                lblInfo.Text = "Não Disponível " & ex.Message
            End Try
        End If
    End Sub

    Private Sub btnInfoSistema_Click(sender As Object, e As EventArgs) Handles btnInfoSistema.Click
        If cboDrive.SelectedIndex <> -1 Then
            Try
                lblInfo.Text = "Sistema : " & DiscoRigido.Sistema(cboDrive.Text).ToString
            Catch ex As Exception
                lblInfo.Text = "Não Disponível " & ex.Message
            End Try
        End If
    End Sub

    Private Sub btnModelo_Click(sender As Object, e As EventArgs) Handles btnModelo.Click
        If cboDrive.SelectedIndex <> -1 Then
            Try
                lblInfo.Text = "Modelo : " & DiscoRigido.Modelo(cboDrive.Text).ToString
            Catch ex As Exception
                lblInfo.Text = "Não Disponível " & ex.Message
            End Try
        End If
    End Sub

    Private Sub btnInfoDispositivos_Click(sender As Object, e As EventArgs) Handles btnInfoDispositivos.Click
        'Obtém todos os dispositivos
        Dim mosDisks As New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive")
        ' percorre cada objeto (disco)
        For Each moDisk As ManagementObject In mosDisks.[Get]()
            ' exibe o dispositivo na label 
            lblInfo.Text = lblInfo.Text & moDisk("Model").ToString() & vbCrLf
        Next
    End Sub
End Class

No evento Load do formulário definimos o valor padrão a ser exibido no controle Combobox cboDrive como sendo igual a 2 ou seja o valor C.

A seguir em cada evento Click usando a classe DiscoRigido e o método correspondente para retornar a informação desejada.

Apenas no último botão de comando estamos usando uma instrução : "SELECT * FROM Win32_DiskDriv" e para retornar todos os dispositivos instalados

Executando o projeto iremos obter o seguinte resultado:

Pegue o projeto completo aqui:  DiscoRigido_Info.zip

Mas faço-vos saber, irmãos, que o evangelho que por mim foi anunciado não é segundo os homens.
Porque não o recebi, nem aprendi de homem algum, mas pela revelação de Jesus Cristo.

Gálatas 1:11-12

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti