WMI ile Harddisk Seri Numarası Kontrolü

WMI ile Harddisk Seri Numarası Kontrolü Bu makalemizde bir console uygulaması ile harddisk’imizin marka / model, tip ve seri numarası (üretici tarafından belirlenen seri no) gibi bilgilerini nasıl elde edebileceğimizi görüp WMI (Windows Management Instrumentation) ve System.Management isim alanı ile tanışacağız.

WMI ve System.Management Isim Alanı

Bu makalemizde bir console uygulaması ile harddisk’imizin marka / model, tip ve seri numarası (üretici tarafından belirlenen seri no) gibi bilgilerini nasıl elde edebileceğimizi görüp WMI (Windows Management Instrumentation) ve System.Management isim alanı ile tanışacağız.

Giriş

Öncelikle harddisk’imizin marka/model, tip ve seri numarası gibi bilgileri öğrenmenin bize getireceklerinden kısaca bahsedelim.Yazılım konusunda her geliştiricinin kafasını kurcalayan bir konudur lisanslama sorunu.Bir yazılım yaratırken sadece kendi belirlediğimiz kişilerin bu yazılımı kullanabilmesini isteyebiliriz (örn: ticari uygulamalar).Bu nedenle zaman içerisinde çeşitli kontrol mekanizmaları ve yöntemleri geliştirilmiştir.Bunlardan bazılarına değinelim: İlk yöntem “Activation” adı verilen ve sizin tarafınızdan belirlenen ve programa atanan bir kullanıcı numarasının internet üzerindeki bir sunucu tarafından kontrol edilmesi yöntemidir. Bu yöntem büyük yazılım şirketleri tarafından sıkça kullanılmaktadır. Kullanıcı numarası her açılışta kontrol ediliyorsa, kullanıcının programı kullanırken sürekli olarak internete bağlı kalması gibi bir zorunluluk vardır.Bu da bir dezavantaj olarak karşımıza çıkmaktadır. Ayrıca bu numarayı kontrol eden sunucunun da bir maliyeti vardır.Diğer bir yöntem Harddisk Volume Serial Number denen numarayla yazılımı özdeşleştirmektir. Bu yöntem pek kullanışlı değildir, zira harddisk her format’landığında yeni bir numara yaratılmaktadır.Bizim yazımızda inceleyeceğimiz konu, başka bir yöntem olan, yazılımımızı harddisk’in üretici tarafından belirlenen ve ürüne atanan seri numarası ile özdeşleştirme yöntemiyle ilgilidir. Bu şekilde yapılacak bir lisanslama ile yazılım sadece belirlenen/izin verilen sabitdisk ile çalışacaktır. Yazının ilerleyen bölümlerinde yaratacağımız proje ile edindiğimiz bilgileri bu şekilde kullanabiliriz.

Bu bilgiler tabiki sadece lisanslama alanında kullanılmaz, ileride bahsedeceğimiz WMI’ın sınıfları içerisinden benzer yöntemlerle sistemin her parçası hakkında bilgi edinmek mümkündür. Bu yüzden kullanım alanı sınırsızdır. Bu konuda yaratıcılık size kalmıştır.

WMI nedir?

Açılımı Windows Management Instrumentation olan, Windows Yönetim Araçları/Yardımcıları olarak türkçeye çevrilen WMI, bir Windows işletim sistemi bileşenidir. Bu bileşen sistemdeki yönetim bilgilerine erişimi amaçlar, yönetim görevlerini yürütür, yürütmeye yardımcı olur. WMI, içerisinde Win32, Registry, System gibi sınıflar ve IIS, Active Directory, DNS provider gibi birçok sağlayıcı barındırır.WMI sınıfları ve sağlayıcıları hakkında detaylı bilgiyehttp://msdn.microsoft.com/library/en-us/wmisdk/wmi/wmi_reference.asp adresinden erişebilirsiniz.

System.Management İsim Alanı

NET Framework içerisindeki System isim alanlarından birisi olan System.Management, WMI yapısı içerisinde belirlenmiş sistem,sisteme bağlı olan aygıtlar ve uygulamalarla ilgili geniş bir yönetim bilgisine ve yönetim uygulamalarına erişimi sağlar.System.Management içerisindeki sınıflarla sistemimizdeki bileşenlere erişip bunlar hakkında -sağlanan- her türlü bilgiyi sorgulayabiliriz. Bu yüzden projemizde harddisk bilgisine erişmek için bu isim alanından (Spesifik olarak Win32_DiskDrive ve Win32_PhysicalMedia sınıflarından) yararlanacağız.

System.Management isim alanı ile ilgili detaylı bilgiye:http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemmanagement.aspadresinden erişebilirsiniz.

Örnek Program

Artık kodlamaya geçebiliriz. Yaratacağımız projede sadece bilgileri sistemden almakla ilgileneceğimiz için bir c# console uygulaması yaratarak işe başlıyoruz.

Bahsettiğimiz gibi projemizin önemli bir kısmı için System.Management isim alanını kullanacağız. Bu isim alanı varsayılan olarak Reference bölümüne eklenmediği için .NET Component’leri arasından biz ekleyelim.

Isim alanını kullanabilmek için de using direktiflerimiz arasına

using System.Management;

ifadesini ekleyelim.

Öncelikle, erişmek istediğimiz bilgiler model, tip (IDE/SCSI ) ve seri numarası olduğu için buna uygun, harddisk bilgilerinin tutulacağı bir sınıf hazırlayalım.

class hardDisk{        private object model = null;        private object tip = null;        private object seriNo = null;

      public object Model       {              get              {                    return model;              }              set              {                    model = value;              }        }        public object Tip        {              get              {                    return tip;              }             set              {                    tip = value;              }        }        public object SeriNo       {              get              {                    return seriNo;              }              set              {                    seriNo = value;              }        } }

Bu sınıfta private olarak tanımladığımız model,tip ve seriNo nesnelerine belirlediğimiz metotların içerisindeki get-set bloklarıyla eriştik.Burada veri tipi olarak object kullanmamızın sebebi WMI sınıflarından gelen verilerin object tipinde olması ve bu verileri ekrana yazdıracağımız Console.Writeline() metodunun da object tipi almasıdır. Istersek bu verileri string olarak tanımlayıp ToString() metoduyla tür dönüşümü de yapabiliriz.Şimdi sıra geldi asıl işlevi yapacak olan Main metodumuzu yazmaya. Metodumuz içerisinde öncelikle sistemimizdeki harddiskler için bir koleksiyon tanımlamalıyız.

Bunu yapabilmek için:

using System.Collections;

direktifini direktiflerimiz arasına ekliyoruz. Boylece using direktifleri aşağıdaki gibi görünecektir.using System;using System.Collections;using System.Management;Artık Main metodu içerisinde koleksiyonumuzu tanımlayabiliriz:

ArrayList hddCollection = new ArrayList();

Bu bölümden sonra küçük bir sorunla karşı karşıya kalmaktayız : Sistemimizdeki harddisk’lerin bilgisine Win32_DiskDrive sınıfıyla erişilmektedir,fakat bu sınıf istediğimiz bilgi türlerinden sadece tip ve model değişkenlerini bize sağlamaktadır. Harddiskin seri numarasına ise Win32_PhysicalMedia sınıfıyla erişilebilmektedir. (Bu bilgileri sağlayan parametrelerin detaylı listesi için referanslar bölümündeki ilgili sınıfın adresine göz atabilirsiniz.)Bu yüzden bu sınıfları kullanarak bu bilgileri sırayla sorgulayacağız.

Öncelikle gereken bilgilerin bir kısmını Win32_DiskDrive sınıfıyla sorgulayalım :

ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");

foreach(ManagementObject disk in searcher.Get()){       hardDisk hdd = new hardDisk();       hdd.Model = disk["Model"];       hdd.Tip = disk["InterfaceType"];       hddCollection.Add(hdd);}

Bu kod ile ManagementObjectSearcher sınıfı yardımıyla taramamızı gerçekleştirecek nesneyi yarattıkGörüldüğü gibi basit bir SELECT ifadesiyle bir veri tabanını sorgular gibi WMI’da tanımlanmış Win32_DiskDrive bilgisini elde ettik. Daha sonra sistemdeki her harddisk için ManagementObjectSearcher’ın Get() metoduyla bilgileri alarak döngü içerisinde değişkenlerimize atadık ve her harddisk’i koleksiyonumuza ekledik.

Şimdi de geriye kalan seri numarası bilgisini Win32_PhysicalMedia sınıfıyla sorgulayarak daha önceden koleksiyonumuza kattığımız harddisklerin bilgilerine ekleyelim :

searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");

int index = 0;foreach(ManagementObject disk in searcher.Get()){       hardDisk hdd = (hardDisk)hddCollection[index];       if (disk["SerialNumber"] == null) hdd.SeriNo = "Tanimsiz";       else hdd.SeriNo = disk["SerialNumber"];       ++index;}

Yine basit bir SELECT ifadesiyle Win32_PhysicalMedia bilgisini elde ettik. Burada bir index değişkeni kullanmamızın sebebi daha önceden belirlediğimiz koleksiyon elemanlarına erişmektir. Döngü içerisinde bu elemanlara sıradan erişerek eksik olan SeriNo bilgisini (bilgi yoksa “Tanimsiz” ifadesini) ekledik ve böylece tüm istenilen bilgiler tamamlanmış oldu.

Artık son olarak bu bilgilerimizi ekrana yazdıracak bloğu yazacağız.

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

index = 1;foreach(hardDisk hdd in hddCollection) {        Console.WriteLine("{0}. Harddisk",index);       Console.WriteLine();       Console.WriteLine("Model: " + hdd.Model);        Console.WriteLine("Tip: " + hdd.Tip);        Console.WriteLine("Seri No: " + hdd.SeriNo);        Console.WriteLine();       ++index;} Console.ReadLine();

Görüldüğü gibi koleksiyondaki her sınıf üyesi için bilgileri şekilli bir biçimde tek tek ekrana yazdırdık.

Son Olarak

Bu makalemizde öncelikle yazılım sektöründe lisanslamaya daha sonra da kısaca WMI’a değindik, sağladığı bilgi ve yöntemlere erişmek için gereken System.Management isim alanını inceledik ve harddisk’imizle ilgili bilgileri ekrana yazdıran bir console uygulamasını c# dilinde yazdık.Dilerseniz aşağıdaki referansları kullanarak yazıdaki konularla ilgili detaylı bilgiye erişebilirsiniz. Bir başka yazıda görüşmek üzere.

Örnek program

Referanslar:WMI : http://msdn.microsoft.com/library/en-us/wmisdk/wmi/wmi_reference.aspSystem.Management İsim Alanı : http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemmanagement.aspWin32_DiskDrive Sınıfı : http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_diskdrive.aspWin32_PhysicalMedia Sınıfı : http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_physicalmedia.asp

NOT: Bu makalede yarattığımız programın esin kaynağı ve benzeri olan bir hdd seri no bulma programını http://www.codeproject.com/csharp/ adresinde bulabilirsiniz.

Yazar : Arden Agopyane-Posta : arden@hotmail.com.tr

Döküman Arama

Başlık :

Kapat