C# rilevare le informazioni del disco rigido del proprio pc con .NET 10

Articolo che illustra una tecnica per rilevare informazioni sul disco rigido, utilizzando l'ultima versione .NET 10.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come estrapolare informazioni del nostro computer, in particolare per conoscere dati importanti riguardante il nostro hard disk o SSD.
Senza l’utilizzo di librerie di terze parti, scopriremo tramite la classe “ManagementObjectSearcher” informazioni che ci possono tornare utile sulla memoria del computer.
Il progetto sarà di tipo Windows forms con il linguaggio di programmazione C#, tramite l’ambiente di sviluppo “Visual Studio 2026 Community” con l’ultima versione del Framework .Net, nel momento in cui stiamo scrivendo è la 10.

Creazione del progetto


Si crea un nuovo progetto di tipo Windows Application, impostando come versione del Framework la 10, al momento presente solo questa per l’ambiente di sviluppo Visual Studio 2026.
Dopo aver creato il progetto, nella form, aggiungiamo alcuni controlli, in particolare tre controlli Label, un controllo cornice e tre controlli textbox, il tutto come mostrato in figura 1.

Figura 1  - Il posizionamento dei controlli

Figura 1  - Il posizionamento dei controlli

Nella prima casella di testo, impostiamo la proprietà “Name” con il valore “txtModello”, la seconda, impostiamo il valore della proprietà “Name” con “txtNumeroSeriale”, ed infine, l’ultima casella di testo, con il valore “txtStato” .

Aggiungiamo al progetto il riferimento a “System.Managament”, che è un libreria di Microsoft che in passato era tra i riferimenti di progetto, per rilevare informazioni hardware, tra cui quelle che occorrono a noi. Aggiungiamo il riferimento tramite Nuget, il tutto come mostrato in figura 2.

Figura 2 - Il riferimento al componente

Figura 2 - Il riferimento al componente

Stesura del codice


Terminata la creazione del progetto, dobbiamo scrivere il codice per estrapolare le informazioni. Passiamo in visualizzazione codice, ed in alto sopra ad ogni dichiarazione, aggiungiamo lo spazio dei nomi di questo riferimento, di seguito si riporta il frammento di codice della suddetta dichiarazione.

C#
using System.Management;

In una parte qualsiasi della classe form, dopo il costruttore, scriviamo una funzione, che verrà richiamata nell’evento load del form, con il quale rileviamo informazioni del nostro disco, quale modello, numero seriale e lo stato. 
Tramite la classe ManagementObjectSearcher, passando nel costruttore la select a “Win32_DiskDrive” che permette di rilevare tutte le informazioni sul disco rigido, tramite il metodo “get” otteniamo uno o più oggetti (in base a quanti sono i dischi sul pc) di tipo “ManagementObject”, con il quale abbiamo informazioni sul disco.
Di seguito si riporta il frammento di codice delle suddette operazioni. 

C#
private void GetInformazioniMemoriaSSDHardkisk()
{
    try
    {
        ManagementObjectSearcher mosDiskDrive = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
        foreach (ManagementObject disco in mosDiskDrive.Get())
        {
            string modello = disco["Model"]?.ToString() ?? "N/A";
            string numeroSeriale = disco["SerialNumber"]?.ToString() ?? "N/A";
            string stato = disco["Status"]?.ToString() ?? "N/A";
            txtModello.Text += modello+ "\r\n" ;
            txtNumeroSeriale.Text +=    numeroSeriale +"\r\n";
            txtStato.Text +=  stato+ "\r\n";
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Errore: " + ex.Message);
    }
}

Passiamo in visualizzazione grafica e facciamo click in ogni parte della form, in modo che passiamo in visualizzazione codice dell’evento load della form. In questo metodo viene invocato la funzione appena creata, di seguito si riporta il frammento di codice.

C#
 private void FrmInformazioniPC_Load(object sender, EventArgs e)
{
    GetInformazioniMemoriaSSDHardkisk();
}

Nel caso che vogliamo sapere la capacità del disco, tramite la proprietà size possiamo rilevare tale dato.
Di seguito si riporta una funzione, che restituisce la dimensione e riportando in forma abbreviato l'unità di misura (Gigabyte o terabyte).

C#
   string GetSpazioTotale(ulong dimensione)
   {
       string spazioTotale;
       if (dimensione != 0)
       {
           try
           {
               ulong sizeBytes = Convert.ToUInt64(dimensione);
               double sizeGB = sizeBytes / (1024.0 * 1024.0 * 1024.0);
               if (sizeGB >= 1000.0)
               {
                   double sizeTB = sizeGB / 1024.0; 
                   spazioTotale = $"{sizeTB:F2} TB";
               }
               else
               {
                   spazioTotale = $"{sizeGB:F2} GB";
               }
           }
           catch
           {
               spazioTotale = "N/A";
           }
       }
       else
       {
           spazioTotale = "N/A";
       }
    return spazioTotale;
   }

Ora non resterà che modificare la nostra funzione, aggiungendo la riga di codice per richiamare questa funzione.
Di seguito si riporta la riga modifica.

C#
string spazioTotale = disco["Size"] != null ? GetSpazioTotale(Convert.ToUInt64(disco["Size"])) : "N/A";

Di seguito si riporta la funzione completa con la nuova modifica.

C#
private void GetInformazioniMemoriaSSDHardkisk()
{
    try
    {
        ManagementObjectSearcher mosDiskDrive = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
        foreach (ManagementObject disco in mosDiskDrive.Get())
        {
            string modello = disco["Model"]?.ToString() ?? "N/A";
            string numeroSeriale = disco["SerialNumber"]?.ToString() ?? "N/A";
            string stato = disco["Status"]?.ToString() ?? "N/A";
            string spazioTotale = disco["Size"] != null ? GetSpazioTotale(Convert.ToUInt64(disco["Size"])) : "N/A";
            txtModello.Text += modello + "\r\n";
            txtNumeroSeriale.Text += numeroSeriale + "\r\n";
            txtStato.Text += stato + "\r\n";
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Errore: " + ex.Message);
    }
}

Nel caso che desideriamo conoscere tutte le proprietà di “Win32_DiskDrive”, potremmo effettuare una ricerca tra tutti gli elementi, e rilevare l’eventuale valore per ciascuno.
Il ciclo avviene nella proprietà “Proprties” dell’oggetto ManagamentObject con il quale estrapoliamo il nome ed il valore della proprietà.
Di seguito si riporta una funzione che estrapola tutti gli elementi con i relativi valori e li visualizza a video.

C#
private void VisualizzaTutteProprieta()
{
   var MOsearcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
   foreach (ManagementObject elemento in MOsearcher.Get())
   {
       var sb = new StringBuilder();
       sb.AppendLine("Proprietà disponibili per Win32_PhysicalMedia:");
       foreach (PropertyData prop in elemento.Properties)
       {
           string name = prop.Name;
           string value;
           try
           {
               value = prop.Value?.ToString() ?? "<null>";
           }
           catch (Exception ex)
           {
               value = $"<errore lettura: {ex.Message}>";
           }
           sb.AppendLine($"{name}: {value}");
       }
       MessageBox.Show(sb.ToString(), "Win32_PhysicalMedia");
   }
}

Possiamo richiamare la funzione nell’evento load della form, di seguito il frammento di codice delle suddette operazioni.

C#
private void FrmInformazioniPC_Load(object sender, EventArgs e)
{
   VisualizzaTutteProprieta();
   GetInformazioniMemoriaSSDHardkisk();
}

Conclusioni

L’articolo ha fornito al lettore istruzioni su come rilevare le informazioni del proprio pc, in un progetto di tipo Windows Application, con il linguaggio di programmazione C#. Tramite le varie classi presenti nello spazio dei nomi “System.Management”, possiamo rilevare informazioni utili sulle varie componenti sistema operativo Windows, in questo caso del disco rigido.  Diversi gli scenari che si aprono come la realizzazione di  applicazioni informativi sull’hardware o per gestire i progetti estrapolando informazioni sull’hardware, come per esempio rilevare il seriale del disco rigido, per una gestione delle licenze più rigida e mirata.