2014-12-23 12 views
7

Voglio ottenere il nome del modello da una lettera di unità. Per esempio Crucial_CT256MX100SSD1 è il modello del mio disco C:\Ottenere il modello di unità dalla lettera di unità

Il modello può essere recuperato con una semplice query WMI,

var hdd = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Index = '0'") 
    .Get() 
    .Cast<ManagementObject>() 
    .First(); 
MessageBox.Show(hdd["Model"].ToString()); 

Tuttavia, non riesco a filtrare la query con la lettera di unità.

Sfortunatamente Win32_LogicalDisk non ha il modello dell'unità.

Non ho più idee.

+0

È ancora necessario utilizzare WMI. Non conosco la query esatta, ma è necessario esaminare un'unità _physical_. Una lettera di unità non corrisponde a un'unità fisica specifica. Può rappresentare una partizione all'interno di una singola unità, l'unica partizione su una singola unità o persino una partizione logica che si estende su più unità. Quindi il primo passo è decidere cosa intendi per "ottenere il nome del modello da una lettera di unità". –

+0

Leggendo la tua domanda un'altra volta, penso di non aver dato una risposta corretta alla tua domanda. Ma questo ti aiuta ulteriormente: http: //www.geekpedia.com/tutorial233_Getting-Disk-Drive-Information-using-WMI-and-Csharp.html – Sjips

+0

@Sjips Se * sai * non hai fornito la risposta corretta, *** non rispondere alla domanda! *** – cybermonkey

risposta

11

Ho scritto una funzione che dovrebbe fare quello che ti serve:

class Program 
{ 
    static void Main(string[] args) 
    { 
     const string drive = "C:"; 

     Console.WriteLine("Drive {0}'s Model Number is {1}", drive, GetModelFromDrive(drive)); 
    } 

    public static string GetModelFromDrive(string driveLetter) 
    { 
     // Must be 2 characters long. 
     // Function expects "C:" or "D:" etc... 
     if (driveLetter.Length != 2) 
      return ""; 

     try 
     { 
      using (var partitions = new ManagementObjectSearcher("ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='" + driveLetter + 
              "'} WHERE ResultClass=Win32_DiskPartition")) 
      { 
       foreach (var partition in partitions.Get()) 
       { 
        using (var drives = new ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + 
                 partition["DeviceID"] + 
                 "'} WHERE ResultClass=Win32_DiskDrive")) 
        { 
         foreach (var drive in drives.Get()) 
         { 
          return (string) drive["Model"]; 
         } 
        } 
       } 
      } 
     } 
     catch 
     { 
      return "<unknown>"; 
     } 

     // Not Found 
     return "<unknown>"; 
    } 
} 

Basta passare una stringa, ad esempio C: o D:. Deve essere solo la lettera del drive e il colon. Inoltre, ho fatto questo lavoro solo per i dischi rigidi. Non funzionerà su unità CD-ROM. Può essere espanso, se ti serve comunque quella funzionalità.

+1

Funziona bene, anche con unità flash USB o dischi rigidi USB. Grazie ! – fakemeta

1

Credo che la mappatura dell'unità partizione possa essere letta dalle classi Win32_LogicalDiskToPartition e Win32_DiskDriveToDiskPartition.

0

Penso che tu possa ottenere le informazioni dal registro. Ho un SSD Intel e ho cercato il suo nome nel gestore dispositivi. Quando ho fatto una ricerca registro ho trovato:

enter image description here

Quindi penso quando il codice per iterare attraverso gli HKLM\HARDWARE\DEVICEMAP\Scsi è possibile trovare le informazioni.

+0

Questo solo * parzialmente * risponde alla domanda. Si prega di modificare la risposta con un esempio di codice di COME per recuperare queste informazioni e rimuoverò il downvote e inversamente. – cybermonkey

1

Win32_DiskDriveToDiskPartition, Win32_LogicalDiskToPartition

forza bruta:

  1. adottare tutti i dischi

    SELECT * FROM Win32_DiskDrive

  2. Per ogni disco ottenere partizioni

    ASSOCIATORI di {W in32_DiskDrive.DeviceID = disk.DeviceID} dove AssocClass = Win32_DiskDriveToDiskPartition

  3. Per ogni partizione lettera del volume get

    ASSOCIATORI DELLA {Win32_DiskPartition.DeviceID = partition.DeviceID} dove AssocClass = Win32_LogicalDiskToPartition