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)
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 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
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
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
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.