WMI, DiskDrive, DiskPartition und kurz vorm Selbstmord



  • hey leute.

    ich bin grad kurz davor aus dem fenster zu hüpfen und da ich im 4.Stock wohne wäre mir zumindest dieser Erfolg sicher..
    Aber vielleicht kann mich einer von euch vor diesem Schicksal bewahren.

    Also, ich will zu einem Driverletter, die entsprechende Seriennummer der HDD herausfinden, die zu diesem Driveletter gehört. hab ange gesucht und bin nun der meinung das ich das über wmi wohl am einfachsten machen kann..
    komme da aber nicht weiter..

    hier mein code

    static String getSerial(string driveletter)
            {
                String serial="";
                ManagementObjectSearcher obs = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk WHERE DeviceID = '"+driveletter+"'");
    
                //über alle LogicalDisks iterieren, auch wenns nur eine sein kann
                foreach (ManagementObject o in obs.Get())
                {
                    //nun über alle partitionen iterieren, bis hierhin gehts
                    foreach (ManagementObject ldtp in o.GetRelationships("Win32_LogicalDiskToPartition"))
                    {
                        //nun wollte ich mir wieder alle relationen holen und darüber iterieren
                        //nur leider ist diese collection an dieser stelle leer?!?
                        //was mache ich an dieser stelle falsch?
                        foreach (ManagementObject dd in ldtp.GetRelationships("Win32_DiskDriveToDiskPartition"))
                        {
                            serial = (string)dd["SerialNumber"];
                        }
                    }
                }
                return serial;
            }
    

    hat wer ne idee? wenn noch mehr infos gebrauct werden versuche ich die nachzureichen.
    ach ja, hab keine ahnung von WMI 😉



  • Wie wäre es mit derSystem.IO.DriveInfo-Klasse?



  • Nein, das geht leider nicht. Ich brauch irgendwas eindeutiges. Etwas das auch nach einer Neuinstallation des Rechners noch gültig ist. Am beseten wäre da in meinen Augen die Seriennummer der Festplatte.



  • so nachdem ich ein paar mal aus dem fenster gehüpft bin habe ich nun diesen code

    static string getSerial(string driveletter)
            {
                ManagementObjectSearcher obs = new ManagementObjectSearcher
                         ("root\\cimv2:Win32_LogicalDisk",
                          "ASSOCIATORS OF {Win32_LogicalDisk.DeviceID='" + driveletter + "'} WHERE AssocClass = Win32_LogicalDiskToPartition");
    
                obs.Options.ReturnImmediately = true;
    
                ManagementObjectCollection.ManagementObjectEnumerator Enumerator = obs.Get().GetEnumerator();
    
                Enumerator.MoveNext();
                ManagementObject o = (ManagementObject) Enumerator.Current;
    
                obs.Query = new ObjectQuery
                           ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + o["DeviceID"] + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition");
    
                obs.Scope = new ManagementScope("root\\cimv2:Win32_DiskPartition");
    
                Enumerator = obs.Get().GetEnumerator();
                Enumerator.MoveNext();
    
                return (((ManagementObject)Enumerator.Current)["SerialNumber"]).ToString();  //hier gibts die exception, mit Manafacturer funzt es zb.
            }
    

    der wohl unter Vista funzt aber nicht unter WinXp.
    2 Fragen:
    1. Warum geht das nicht unter WinXp? Das ist der Text der Exception:

    Eine nicht behandelte Ausnahme des Typs "System.Management.ManagementException" ist in System.Management.dll aufgetreten.

    Zusätzliche Informationen: Nicht gefunden

    2. Wie bekomm ich das schneller? Der geht wohl alle Laufwerke durch oder so, denn ich höre mein FloppyLaufwerk knattern..Wie kann ich es unterbinden, das er auch FloppysCheckt?

    Danke


Anmelden zum Antworten