Προγραμματισμός

Εξερεύνηση των οργάνων διαχείρισης των Windows στο C #

Σε αυτό το άρθρο I, θα παρουσιάσω μια ματιά στην τεχνολογία WMI και πώς μπορείτε να εργαστείτε με το WMI χρησιμοποιώντας τη γλώσσα ερωτήματος WMI στο C #. Στη συνέχεια θα συζητήσω ένα σενάριο όπου μπορείτε να χρησιμοποιήσετε το WMI στον πραγματικό κόσμο.

Τι είναι το WMI;

Το WMI είναι το αρκτικόλεξο για τα Windows Management Instrumentation, μια τεχνολογία Microsoft βασισμένη σε COM που χρησιμοποιείται για την ανάκτηση πληροφοριών που σχετίζονται με το σύστημα. Μπορείτε να χρησιμοποιήσετε αυτήν την τεχνολογία για να ανακτήσετε το αναγνωριστικό CPU, το MAC ID κ.λπ. του συστήματός σας. Περιλαμβάνει μια συλλογή τύπων που λειτουργούν ως περιτύλιγμα γύρω από τους εγγενείς τύπους για την ανάκτηση πληροφοριών που σχετίζονται με το υλικό. Το WMI διευκολύνει μια επικοινωνία χαμηλού επιπέδου με το λειτουργικό σύστημα του κεντρικού υπολογιστή. Μπορείτε να χρησιμοποιήσετε το WMI για να εργαστείτε με μετρητές επιδόσεων ή να ανακτήσετε πληροφορίες υλικού από ένα σύστημα.

Μπορείτε να χρησιμοποιήσετε το WMI για να ανακτήσετε πληροφορίες μεταδεδομένων του υλικού του συστήματός σας, όπως τα εξής:

  1. Σειριακός αριθμός HDD
  2. Μεγέθη HDD
  3. Ελεύθερος χώρος HDD
  4. Σειριακός αριθμός CPU
  5. Ταχύτητα ρολογιού CPU
  6. Τύπος υποδοχής CPU
  7. Διεύθυνση MAC προσαρμογέα δικτύου
  8. Προεπιλεγμένη πύλη προσαρμογέα δικτύου

Έχουμε αρκετές θεωρητικές πληροφορίες - ας βρούμε τώρα έναν κώδικα.

Προγραμματισμός WMI σε C #

Το παρακάτω απόσπασμα κώδικα χρησιμοποιεί το ερώτημα WQL για να συμπληρώσει μια λίστα με τα ονόματα των λογικών δίσκων στο σύστημά σας. Ένα τυπικό ερώτημα WMI μοιάζει με αυτό:

Επιλέξτε * FROM Win32_Processor

Όπως μπορείτε να δείτε στο απόσπασμα κώδικα, η κλάση SelectQuery χρησιμοποιείται για τη διαμόρφωση ενός ερωτήματος WQL.

στατική λίστα PopulateDisk ()

        {

Λίστα δίσκων = νέα λίστα ();

SelectQuery selectQuery = νέο SelectQuery ("Win32_LogicalDisk");

ManagementObjectSearcher mnagementObjectSearcher = νέο ManagementObjectSearcher (selectQuery);

foreach (ManagementObject managementObject στο mnagementObjectSearcher.Get ())

            {

disk.Add (managementObject.ToString ());

       }

δίσκος επιστροφής;

    }

Σημειώστε ότι πρέπει να συμπεριλάβετε το χώρο ονομάτων System.Management (διαθέσιμο ως μέρος του System.Management.dll) στο έργο σας. Οι κλάσεις WMI που περιλαμβάνονται ως μέρος αυτού του χώρου ονομάτων περιλαμβάνουν τα ακόλουθα:

  1. Win32_LogicalDisk - αυτή η κλάση αντιπροσωπεύει μια πηγή δεδομένων που αντιστοιχεί στη συσκευή αποθήκευσης στο σύστημά σας. Μπορείτε να χρησιμοποιήσετε αυτήν την τάξη για να ανακτήσετε τον σειριακό αριθμό, τον διαθέσιμο ελεύθερο χώρο και το αρχικό μέγεθος του σκληρού δίσκου.
  2. Win32_NetworkAdapterConfiguration - αυτή η κλάση αντιπροσωπεύει τα χαρακτηριστικά ενός προσαρμογέα δικτύου στο σύστημά σας. Μπορείτε να χρησιμοποιήσετε αυτήν την τάξη για να ανακτήσετε τη διεύθυνση MAC, την κατάσταση IP ή τις προεπιλεγμένες πληροφορίες πύλης IP.
  3. Win32_Processor - αυτή η κλάση αντιπροσωπεύει τον επεξεργαστή που εκτελείται σε ένα σύστημα με εγκατεστημένο το λειτουργικό σύστημα των Windows. Μπορείτε να χρησιμοποιήσετε αυτήν την τάξη για να ανακτήσετε το αναγνωριστικό CPU, την κατάσταση της CPU, την ταχύτητα του ρολογιού CPU κ.λπ. των επεξεργαστών στο σύστημά σας.

Για να λάβετε τις πληροφορίες μεταδεδομένων των σταθερών δίσκων στο σύστημά σας, δηλαδή το όνομα, τον ελεύθερο χώρο, το μέγεθος του δίσκου κ.λπ., μπορείτε να χρησιμοποιήσετε τον ακόλουθο κώδικα.

στατικό κενό GetDiskMetadata ()

        {

System.Management.ManagementScope managementScope = νέο System.Management.ManagementScope ();

System.Management.ObjectQuery objectQuery = νέο System.Management.ObjectQuery ("επιλέξτε FreeSpace, Size, Name από Win32_LogicalDisk όπου DriveType = 3");

ManagementObjectSearcher managementObjectSearcher = νέο ManagementObjectSearcher (managementScope, objectQuery);

ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get ();

foreach (ManagementObject managementObject in managementObjectCollection)

            {

Console.WriteLine ("Όνομα δίσκου:" + managementObject ["Όνομα"]. ToString ());

Console.WriteLine ("FreeSpace:" + managementObject ["FreeSpace"]. ToString ());

Console.WriteLine ("Μέγεθος δίσκου:" + managementObject ["Μέγεθος"]. ToString ());

Console.WriteLine ("--------------------------------------------- ------ ");

            }

        }

Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να ανακτήσετε τον σειριακό αριθμό έντασης των σκληρών δίσκων στο σύστημά σας.

στατική συμβολοσειρά GetHardDiskSerialNumber (string drive = "C")

        {

ManagementObject managementObject = νέο ManagementObject ("Win32_LogicalDisk.DeviceID = \" "+ drive +": \ "");

managementObject.Get ();

return managementObject ["VolumeSerialNumber"]. ToString ();

        }

Για να αποκτήσετε το ProcessId του επεξεργαστή στο σύστημά σας, θα πρέπει να καθορίσετε το "ProcessorId" στη συστοιχία ιδιοτήτων της παρουσίας κλάσης ManagementObject, όπως φαίνεται στο απόσπασμα κώδικα που ακολουθεί.

string processorId = managementObject.Properties ["ProcessorId"]. Value.ToString ();

Για να αποκτήσετε την ταχύτητα ρολογιού του επεξεργαστή στο σύστημά σας, θα πρέπει να καθορίσετε το "CurrentClockSpeed" στη συστοιχία ιδιοτήτων της παρουσίας κλάσης ManagementObject, όπως φαίνεται στο απόσπασμα κώδικα που ακολουθεί.

Int32 clockSpeed ​​= Convert.ToInt32 (managementObject.Properties ["CurrentClockSpeed"]. Value.ToString ());

Τώρα που έχουμε διερευνήσει τον προγραμματισμό WMI χρησιμοποιώντας το C #, επιτρέψτε μου να σας πω ένα πρακτικό παράδειγμα όπου μπορείτε να χρησιμοποιήσετε το WMI. Στην πραγματικότητα χρησιμοποίησα το WMI σε μερικά από τα έργα μου για την εφαρμογή κλειδώματος κόμβων - μια δυνατότητα που αποτρέπει την αντιγραφή μιας εφαρμογής σε άλλο σύστημα και την εκτέλεση σε αυτό.

Κλείδωμα κόμβου

Επιτρέψτε μου να εξηγήσω τι έκανα για να εφαρμόσω το κλείδωμα κόμβων και γιατί χρειαζόταν. Το κλείδωμα κόμβων συνεπάγεται το κλείδωμα ενός κόμβου - ένας κόμβος είναι απλώς ένα σύστημα. Ουσιαστικά, αυτή η ιδέα εμποδίζει την εγκατάσταση και εκτέλεση ενός εκτελέσιμου που δημιουργείται από την εφαρμογή σας σε πολλά συστήματα. Χρησιμοποίησα το WMI για να ανακτήσω τις λεπτομέρειες υλικού του συστήματος στο οποίο πρέπει να εγκατασταθεί και να εκτελεστεί η εφαρμογή. Στη συνέχεια, αυτές οι λεπτομέρειες κρυπτογραφήθηκαν χρησιμοποιώντας έναν αλγόριθμο κρυπτογράφησης και στη συνέχεια δημιουργήθηκε ένας μοναδικός κωδικός ενεργοποίησης για αυτό το σύστημα. Αυτός ο κωδικός θα πρέπει στη συνέχεια να χρησιμοποιηθεί για την ενεργοποίηση της εφαρμογής. Σημειώστε ότι ο αναγνωριστικός κόμβος ή ο κωδικός ενεργοποίησης είναι μοναδικός επειδή αποτελούνται από έναν συνδυασμό της ταυτότητας CPU και της ταυτότητας MAC του συστήματος στο οποίο θα έπρεπε να εγκατασταθεί και να εκτελεστεί η εφαρμογή.

$config[zx-auto] not found$config[zx-overlay] not found