2014-12-23 10 views
7

से ड्राइव मॉडल प्राप्त करें मैं एक ड्राइव अक्षर से मॉडल नाम प्राप्त करना चाहता हूं। उदाहरण Crucial_CT256MX100SSD1 के लिए,ड्राइव अक्षर

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

हालांकि, मेरी ड्राइव C:\

मॉडल एक सरल WMI क्वेरी के साथ प्राप्त किया जा सकता है की मॉडल है मैं ड्राइव अक्षर के साथ क्वेरी फ़िल्टर नहीं कर सकते।

दुर्भाग्यवश Win32_LogicalDisk में ड्राइव का मॉडल नहीं है।

मेरे पास और अधिक विचार नहीं हैं।

+0

आपको अभी भी WMI का उपयोग करने की आवश्यकता है। मुझे सटीक क्वेरी नहीं पता है, लेकिन आपको _physical_ ड्राइव को देखने की आवश्यकता है। एक ड्राइव अक्षर एक विशिष्ट भौतिक ड्राइव के अनुरूप नहीं है। यह एक ड्राइव के भीतर एक विभाजन का प्रतिनिधित्व कर सकता है, एक ड्राइव पर एकमात्र विभाजन, या यहां तक ​​कि एक लॉजिकल विभाजन जो एकाधिक ड्राइव को फैलाता है। तो पहला कदम यह तय करना है कि "ड्राइव ड्राइव से मॉडल नाम प्राप्त करें" से आपका क्या मतलब है। –

+0

अपना प्रश्न दूसरी बार पढ़ते समय, मुझे लगता है कि मैंने आपके प्रश्न का सही उत्तर नहीं दिया है। लेकिन यह आपको आगे की मदद करता है: http: //www.geekpedia।कॉम/ट्यूटोरियल 233_ गेटिंग-डिस्क-ड्राइव-सूचना-उपयोग-WMI-and-Csharp.html – Sjips

+0

@Sjips यदि आप जानते हैं * आपने सही उत्तर नहीं दिया है, *** प्रश्न का उत्तर न दें! *** – cybermonkey

उत्तर

11

मैंने आपको एक ऐसा फ़ंक्शन लिखा है जो आपको चाहिए:

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>"; 
    } 
} 

बस C: या D: जैसे एक स्ट्रिंग में गुजरें। यह केवल ड्राइव अक्षर और एक कोलन होना चाहिए। इसके अलावा, मैंने यह काम सिर्फ हार्ड ड्राइव के लिए किया है। यह सीडी-रोम ड्राइव पर काम नहीं करेगा। यदि आपको उस कार्यक्षमता की आवश्यकता है, तो इसे विस्तारित किया जा सकता है।

+1

यूएसबी फ्लैश ड्राइव या यूएसबी हार्ड ड्राइव के साथ भी ठीक काम करता है। धन्यवाद ! – fakemeta

1

मेरा मानना ​​है कि विभाजन-ड्राइव मैपिंग Win32_LogicalDiskToPartition और Win32_DiskDriveToDiskPartition कक्षाओं से पढ़ा जा सकता है।

0

मुझे लगता है कि आप रजिस्ट्री से जानकारी प्राप्त कर सकते हैं। मेरे पास इंटेल एसएसडी है, और मैंने डिवाइस मैनेजर में अपना नाम देखा। जब मैं एक रजिस्ट्री खोज किया था मुझे मिल गया:

enter image description here

तो मुझे लगता है कि जब आप कोड पुनरावृति को गर्त HKLM\HARDWARE\DEVICEMAP\Scsi आप की जानकारी पा सकते हैं।

+0

यह केवल * आंशिक रूप से * प्रश्न का उत्तर देता है। कृपया इस जानकारी को पुनः प्राप्त करने के लिए कोड के उदाहरण के साथ अपना उत्तर संपादित करें, और मैं डाउनवोट को हटा दूंगा और इसके बजाय अपवॉट कर दूंगा। – cybermonkey

1

Win32_DiskDriveToDiskPartition, Win32_LogicalDiskToPartition

ब्रूट बल:

  1. Win32_DiskDrive

  2. से सभी डिस्क

    चुनें * ले लो प्रत्येक डिस्क के लिए विभाजन का

    ASSOCIATORS {डब्ल्यू मिल in32_DiskDrive.DeviceID = disk.DeviceID} जहां AssocClass = Win32_DiskDriveToDiskPartition

  3. प्रत्येक विभाजन प्राप्त मात्रा पत्र के लिए

    के

    ASSOCIATORS {Win32_DiskPartition.DeviceID = partition.DeviceID} जहां AssocClass = Win32_LogicalDiskToPartition

संबंधित मुद्दे