Makale Özeti

WMI (Windows Management Instrumentation) ile bilgisayarımıza bağlı tüm donanım hakkında bilgi toplayabiliriz. Öncelikle bunu neden ve sonra da nasıl kullanacağımızı göreceğiz .

Makale

Bilgisayar hakkında topladığımız bilgileri programlarımızı kullanıcı bilgisayarına kurarken kullanabiliriz. Diyelim ki programımızın sağlıklı çalışabilmesi için belirlediğimiz bir  minimum konfigürasyona ihtiyaç var ve kullanıcı makinesinde bu ihtiyaca cevap verecek donanım var mı bilmemiz gerek. Ya da programımıza şifre koyacağız ve bunu genellikle hdd  seri numarasından yaparız. Bunlar gibi pek çok şeyi rahatlıkla yapabileceğimiz kısaca bilgisayarımızın donanımı hakkındaki tüm bilgileri toplayabileceğimiz bir yöntem. Şimdi de nasıl yapacağımız kısmına yani kodlamaya ve icraata geçelim.

 

WMI kullanabilmek için önce kütüphanemizden ilgili namespace eklemesini yapalım referanslardan eklemezsek bu namespace gelmiyor önce referanslardan ekleyiniz..

 

Imports System.Management

 

Daha sonra kodlamada kolaylık olması açısından kodumuzu bir sınıf içine yazıyoruz ve sınıfımızın içine geriye istediğimiz değerleri döndüren fonksiyonlarımızı yazıyoruz. Böylece ana formumuzun kodunu da kalabalıktan kurtarıyor ve OOP (Object Oriented Programming) yasamıza da sadık kalıyoruz.

 

Aşağıdaki foksiyon bize string olarak cpu adını verecektir. Dikkat ederseniz burada bir döngü var o da birden fazla işlemcili makineler de olabileceği içindir ve aynı şey pek çok parçada mümkün. Mesela ekran kartı, hdd .

 

Aslında yaptığımız işlemler tüm fonksiyonlarda hemen hemen aynı. Öncelikle managementClass dan bilgisini alacağımız cihazın sınıfını yaratıyoruz. Sonra bu parçaların (birden fazla ise) tutulduğu koleksiyonu yaratıyoruz. Son olarak da bu koleksiyon içindeki tüm parçalar için bir döngü yaratıp o parçanın bize lazım olan bilgisini alıyoruz. Mesela ilk fonksiyonda ben CPU adını almışım. “Intel P4 3.0 .. ” gibi.

 

    Public Function Cpu() As String

        Dim isim As String

        Dim CpuSinif As New ManagementClass("Win32_Processor")

        Dim CpuKoleksiyon As ManagementObjectCollection = CpuSinif.GetInstances

        Dim CpuNesne As ManagementObject

        For Each CpuNesne In CpuKoleksiyon

            isim = CStr(CpuNesne("Name"))

        Next CpuNesne

        Return isim

    End Function

 

Aşağıdaki fonksiyon bize yine string olarak Ram boyutunu MB cinsinden döndürür.

 

    Public Function Ram() As String

        Dim toplamRam As Integer = 0

        Dim RamSinif As New ManagementClass("Win32_PhysicalMemory")

        Dim RamKoleksiyon As ManagementObjectCollection = RamSinif.GetInstances

        Dim RamNesne As ManagementObject

        For Each RamNesne In RamKoleksiyon

            toplamRam += CType(CType(RamNesne("Capacity"), UInt64).ToString, Integer)

        Next

        Return CStr((toplamRam / 1024) / 1024)

    End Function

 

Bu fonsiyonda ise bilgisayarımıza takılı olan hdd lerin partitionlarını ve boyutlarını GB olarak bir hashtablosu halinde döndüreceğiz. Dönecek sonuç :

 “c,40,15 “ , Anlamı Partition adı c, alanı 40Gb ve boş alan 15Gb . Burada mediaType değerini de inceliyoruz. Bunun nedeni logicalDisk alırken koleksiyonumuza o anda takılı usb bellek tipi diskler varsa onların da fonksiyondan değer olarak döndürülmesini engellemek. Burada şart değişkenimizin değerinin “Fixed hard disk media” olması, o zamna hdd partition olduğunu anlıyoruz.

 

    Public Function DiskBoyutlari() As Hashtable

        Dim hddHashTablo As New Hashtable

        Dim diskClass As New System.Management.ManagementClass("Win32_LogicalDisk")

        Dim disks As System.Management.ManagementObjectCollection = diskClass.GetInstances()

        Dim disk As System.Management.ManagementObject

        Dim isim As String

        Dim boyut As System.UInt64

        Dim bosAlan As System.UInt64

        Dim pnpDeviceIDsi As String

        Dim sayacDriver As Integer = 0

 

        For Each disk In disks

            pnpDeviceIDsi = CType(disk("MediaType"), UInt32).ToString

            isim = CStr(disk("Name"))

            boyut = disk("Size")

            bosAlan = disk("FreeSpace")

            If CType(boyut, UInt64).ToString <> "0" AndAlso pnpDeviceIDsi = "12" Then  '12 nin anlamı: Fixed hard disk media

                hddHashTablo.Add(sayacDriver, isim & "," & Fix((((Convert.ToDouble(CType(boyut, System.UInt64)) / 1024) / 1024) / 1024)).ToString & "," & Fix((((Convert.ToDouble(CType(bosAlan, System.UInt64)) / 1024) / 1024) / 1024)).ToString)

                sayacDriver += 1

            End If

        Next disk

        Return hddHashTablo

    End Function

 

  Burada bilgisayardaki seri portların adedini dündürüyoruz.

 

    Public Function SeriPortAdet() As Integer

        Dim seriPortSinif As New Management.ManagementClass("Win32_SerialPort")

        Dim seriPortKoleksiyon As Management.ManagementObjectCollection = seriPortSinif.GetInstances

        Dim seriPortNesne As Management.ManagementObject

        Dim portSayisi As Integer = 0

 

        For Each seriPortNesne In seriPortKoleksiyon

            portSayisi += 1

        Next seriPortNesne

        Return portSayisi

    End Function

 

 Burada bilgisayara tanıtılmış olan tüm network ve direk bağlı yazıcıları görebiliriz.

 

    Public Function printers() As Hashtable

        Dim yaziciHash As New Hashtable

        Dim printerSinif As New Management.ManagementClass("Win32_Printer")

        Dim printerKoleksiyon As Management.ManagementObjectCollection = printerSinif.GetInstances

        Dim printerNesne As Management.ManagementObject

        Dim printerSayac As Integer = 0

        For Each printerNesne In printerKoleksiyon

            yaziciHash.Add(printerSayac, printerNesne("Name"))

            printerSayac += 1

        Next printerNesne

        Return yaziciHash

End Function

 

Programın örnek ekran çıktısı aşağıdakine benzer olacaktır.

 

.

 

Yukarıdaki örnekler genişletilebilir , biraz msdn i karıştırmak yeterli. Miskin kodcular için bu makaledeki örneğin tam kodu aşağıda mevcuttur.

Makalenin tam kodu