|
WMI ile Harddisk Seri Numarası Kontrolü |
|
Gönderiliyor lütfen bekleyin... |
|
|
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ı
bilgiye
http://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 sınıfından) yararlanacağız.
System.Management isim alanı ile ilgili detaylı
bilgiye:
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemmanagement.asp
adresinden 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ık
Gö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:\t\t"
+ hdd.Model);
Console.WriteLine("Tip:\t\t"
+ hdd.Tip);
Console.WriteLine("Seri
No:\t" + 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.
Yazıda geçen örnek uygulamayı indirmek
için tıklayınız.
Referanslar:
WMI : http://msdn.microsoft.com/library/en-us/wmisdk/wmi/wmi_reference.asp
System.Management İsim Alanı : http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemmanagement.asp
Win32_DiskDrive Sınıfı : http://msdn.microsoft.com/library/en-us/wmisdk/wmi/win32_diskdrive.asp
Win32_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.
Makale:
WMI ile Harddisk Seri Numarası Kontrolü C#, Visual C# ve .NET Arden Agopyan
|
|
|
-
-
Eklenen Son 10
-
Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
|
|