C# ve WMI
Özet
Windows Management Instrumentation (WMI), Windows işletim sistemlerinde veri ve operasyon yapısını yönetmemizi sağlıyor. WMI sayesinde donanım sistemimiz hakkında bütün bilgileri elde edebiliriz. Daha iyi anlaşılması açısından, WMI ile yapılabileceklere birkaç örnek verelim: Bilgisayardaki bir işlemi (process) başlatabilirsiniz, olay görüntüleyicisindeki (event viewer) kayıtları sorgulayabilirsiniz, bilgisayarı yeniden başlatabilirsiniz. Bu ve benzeri tüm işlemleri bilgisayarın başında olmadan uzaktan yapabilirsiniz. Donanım elemanları üzerinden örnek verirsek: HDD seri numarasını, HDD boyutunu, HDD boş alanını, CPU seri numarasını, CPU hızını, CPU soket tipini, network adaptörünün MAC adresini, Network adaptörünün default gateway’ini öğrenme vb.
Anahtar Kavramlar:
Win32_LogicalDiskClass, Win32_NetworkAdapterConfiguration Class, Win32_Processor Class, Name, FreeSpace, Description, Macadress
Giriş
Makalede CPU, network kartı ve HDD hakkında sistemimize dair bilgiler elde edeceğiz. WMI, tüm bu işleri bünyesindeki 900′e yakın sınıf sayesinde gerçekleştirebilir. Bu sınıfların her birinde çeşitli amaçlara yönelik olarak hazırlanmış fonksiyonlar bulunmaktadır.C#’a ait üç sınıf kullanacağız ve Microsoft Visual Studio 2008 kullanarak dört uygulama geliştireceğiz. Bizim kullancağımız sınıflar Win32 LogicalDisk Class, Win32 Network Adapter Configuration Class, Win32 Processor Class. Daha fazla sınıfa System.Management.Namespace’ten ulaşabilirsiniz.
1)Win32_LogicalDisk Class
Win32_LogicalDisk Windows sistemimizde çalışan hard diskimiz için veri kaynakları sunuyor. Bir Windows işletim sistemi çalışan bilgisayarın üzerinde bulunan ve işletim sistemi tarafından tanınan mantıksal sürücüler hakkındaki bilgileri barındırır.
Uygulama 1: Sistemimizde bulunan hard diskler ve onların sahip olduğu boş alan bilgisinin elde edilmesi.
Şekil-1
Kod kısmı:
string surucu = "";
object bosalan;
ManagementClass disk = new ManagementClass("Win32_LogicalDisk");
ManagementObjectCollection elemandisk = disk.GetInstances();
foreach(ManagementObject el in elemandisk)
{
surucu = el.Properties["Name"].Value.ToString();
listBox1.Items.Add(surucu);
bosalan = el.Properties["FreeSpace"].Value;
if (bosalan!=null)
{
listBox2.Items.Add(bosalan);
}
}
Uygulama 2: Sistemimizde bulunan hard diskler ve onların Windows sistemimizde tanımlamaları.
Şekil-2
Kod kısmı:
ManagementClass hdd = new ManagementClass("Win32_LogicalDisk");
ManagementObjectCollection elemanlar = hdd.GetInstances();
foreach(ManagementObject eleman in elemanlar)
{
string nam = eleman.Properties["Name"].Value.ToString();
string des=eleman.Properties["Description"].Value.ToString();
listBox2.Items.Add(des);
listBox1.Items.Add(nam);
}
2)Win32_NetworkAdapterConfiguration Class
NetworkAdapterConfiguration sayesinde bir network adaptöre ait özelliklere erişiriz. Ayrıca bu class extra bazı özellikler ve metotlar içermektedir. TCP/IP ve IPX (Internetwork Packet Exchange) protokolleri ile ayrıca şu bilgilere erişebiliriz: MAC adresi, default IP gateway, IP enabled status vb.
Uygulama 3: Sistemimizde bulunan ethernet kartımızın MAC adresini elde etme.
Şekil-3
Kod kısmı:
string ethernetserino = "";
ManagementClass ethernetkarti = new
ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection elemanlar = ethernetkarti.GetInstances();
foreach(ManagementObject eleman in elemanlar)
{
if(ethernetserino==String.Empty)
{
if((bool)eleman["IPEnabled"]==true)
{
ethernetserino = eleman["MacAddress"].ToString();
label1.Text = ethernetserino;
}
}
3)Win32_Processor Class
Bu sınıf sayesinde işlemcimizin şu özelliklerine erişebiliriz: CPU ID, CPU üreticisi, CPU durumu, CPU currrent clock speed vb.
Uygulama 4: CPU’muzun “Processor ID”sini elde etme.
Şekil-4
Kod kısmı:
ManagementClass islemci = new ManagementClass("Win32_Processor");
ManagementObjectCollection elemanlar = islemci.GetInstances();
string serino = "";
foreach (ManagementObject eleman in elemanlar)
{
serino = eleman.Properties["ProcessorId"].Value.ToString();
listBox1.Items.Add(serino);
}
Uygulama5: CPU’muza ait diğer özelliklerin listelenmesi.
Şekil-5
Kod kısmı:
ManagementClass islemci = new ManagementClass("Win32_Processor");
ManagementObjectCollection elemanlar = islemci.GetInstances();
foreach (ManagementObject eleman in elemanlar)
{
foreach(PropertyData Ozellikler in eleman.Properties)
{
listBox1.Items.Add(Ozellikler.Name);
}
}
Sonuç: WMI bize büyük bir yarar sağlıyor. Sistemimizin en güncel donanımsal bilgilerine rahatlıkla erişip kendi uygulamalarımızı geliştirebiliriz ve bir çok yerde bu verileri kullanabiliriz. Ek ihtiyacımıza göre kullanabileceğimiz bütün sınıflar verilmiştir.
Kaynaklar:
İnternet:
- http://www.dreamincode.net/forums/topic/42934-using-wmi-class-in-c%23/
- http://geekswithblogs.net/PsychoCoder/archive/2008/01/25/using_wmi_in_csharp.aspx
- http://www.maxiasp.net/post/2010/09/19/yazilim-metodolojileri-iv.aspx
- http://www.yazilimgunlugu.com/msf-e-hizli-bir-bakis-1-makalesi/287.aspx
- http://msdn.microsoft.com/en-us/library/system.management.managementscope.aspx
- http://www.isilorhanel.net/tr/articles/dc4bb98f-00b0-4b48-bf87-23469d53ab7c.aspx
Kitap:
- Vısual C#.NET - Palme Yayıncılık/2005