C# ile WMI Nasıl Kullanılır?

CorsaiR

Emektar
27 Ara 2005
1,228
18
Çekirdekten
C# ile WMI Nasıl Kullanılır?
WMI (Windows Managment Interface), Windows 2000 ve sonrası işletim sistemlerinde bulunan, windows programcılarına işletim sisteminde bulunan hemen hemen her nesneyi denetleme ve yönetme olanağı sunan bir arabirimdir. WMI kullanılarak Windows işletim sistemindeki dosya ayarlarından güvenlik ayarlarına kadar hemen her şey denetlenebilir ve WMI’ın sunduğu metodlarla değerleri değiştirilebilir. WMI hem yerel hem de uzak makinelerde kullanılabilir, programlaması ise oldukça kolaydır.

WMI’ın, bulunduğu makine üzerinde farklı “Namespace” leri vardır. Varsayılan olarak bu “\\makine\root\default“ tur. Fakat içinde bizim için gerekli olan “WMI Class” larını barındıran “\\makine\root\cimv2 “ Namespace’ini kullanacağız. Bir “WMI Class”’ı Windows işletim sistemi üzerindeki bir nesnenin (Örneğin bir dosyanın) özelliklerini barındıran ve gerektiğinde sahip olduğu metodları kullanarak nesneye ait değerleri değiştirebilen bir sınıftır. Örnek olarak “Win32_Process” “cimv2” namespace’i içinde bir WMI sınıfıdır ve işletim sistemi üzerinde çalışan süreçleri görmek, istenildiğinde ise belirli bir süreci sonlandırmak veya yeni bir süreç başlatmak için kullanılabilir. Bir Windows işletim sistemi üzerindeki WMI sınıfları “wbemtest.exe” programı yardımıyla görülebilir.

Windows XP de yaklaşık 900 WMI sınıfı vardır ve bu sınıfların yapabildikleri WMI verimliliği konusunda size bir fikir verebilir. Aşağıdaki resimlerde, “wbemtest.exe” programının işletim sistemi üzerindeki bütün WMI sınıflarını sıralanması ve istenilen sınıfın özelliklerini ve kullanabileceği metodları gösterilmesi anlatılmaktadır.

3288.gif


3288a.gif


3288b.gif


Bu pencerede içeriğini görmek istediginiz sınıfın üzerine çift tıklayın.

3288c.gif


Kırmızı daireler içinde, makinedeki sabit diskler hakkında bilgi alan (Örneğin blok sayısı veya başlık bilgisi gibi) ve diskler üzerinde bazı işlemler yapabilen Win32_LogicalDisk sınıfı görülüyor(ikinci daire).

3288d.gif


Aşağıda yerel ya da uzak bir sistemde çalışan süreçleri gösteren, ve seçilen bir süreci sonlandırabilen basit bir uygulama örneği bulunmaktadır. Bu uygulamada Win32_Process sınıfını kullandım. Süreçleri listelemek için myListView adında bir listView kontrolü ve bu listView’in “Name”,”Parent Process ID”, “Process ID”, “Executable Path” olarak 4 tane sütunu olduğunu varsaydım.



.Net altındaki ListView kontrolü konu dışı olduğundan burada ele alınmayacaktır.

Bu kodu yazarken System.Managment NameSpace’i kullanılmıştır, bunun için System.Managment sınıfını koda referans olarak eklemelisiniz.(Kodun başına da using System.Managment; deyimini koymayı unutmayın )

string[] lvItem = new string[4]; //süreçlerin Listview’in sütunlarına ait bilgilerin depolanacağı dizi
string machineName = “MachineName”; //başlanılacak makine adı
ManagementObjectSearcher mySearcher; //nesne sorgusunu çalıştırıp, dönen değerleri
//toplayacak olan ManagmentObjectSearcher
ManagementObjectCollection myObjectCollection; //mySearcher’dan dönen nesnelerin
//depolanacağı ObjectCollection
ObjectQuery oq; //sorgu stringini tutacak nesne sorgusu
ConnectionOptions co = new ConnectionOptions(); //uzak makine bağlantısında
//kullanılacak bağlantı seçeneklerini tutmak için
co.Username = “username”;
co.Password = “Password” ;
//burada unutulmaması gereken şey yerel makineye yapılan bağlantılarda kullanıcı adı ve şifre
//kullanamayacağınızdır. Yerel makine bağlantısı giriş yaptığnız aktif kullanıcı hesabı ve bu
//hesabın hakları çerçevesinde gerçekleşir . Böyle bir durumda kullanıcı adı ve şifresini boş bırakın
//managment scope üzerinde sorgu gerçekleştirecegimiz WMI namespace’ini tanımlamaktadır.
ManagmentScope ms = new ManagmentScope(“\\\\” + machineName + “\\root\\cimv2”,co);
oq = new ObjectQuery(“SELECT * FROM Win32_Process”); //sorgu string’i
mySearcher = new ManagmentObjectSearcher(ms,oq);
// ms scope’u içinde oq sorgusu kullanılarak, ilgili nesneler toplanacak
myObjectCollection = mySearcher.Get();
//mySearcher da belirtilen sorgu çalı tırılıyor ve geri dönen nesneler myObjectCollection içinde toplanıyor.
// aşağıda dönen her nesnenin (burada myObject” özellikleri alınıyor (““ içindeki ifadeler)
//ve değerleri string veri tipine çevrilerek lvItem dizisine aktarılıyor. Sonra lvItem dizisindeki
//değerler myItem adındaki ListView kontrolü nesnesine geçiriliyor. (Dikkat edilecek nokta ise
//lvItem uzunluğunun myListView kontrolündeki sütun sayısına eşit olduğudur. Sütunlardaki
//değerler ListView kontrolünde SubItem olarak adlandırılır.)

foreach (ManagmentObject myObject in myObjectCollection)
{
lvItem[0] = myObject[“Name”].ToString();
lvItem[1] = myObject[“ParentProcessId”].ToString();
lvItem[2] = myObject[“ProcessId”].ToString();
try
{
lvItem[4] = myObject[“ExecutablePath”].ToString();
}
catch
{
lvItem[4] = “not available”;
} ListViewItem myItem = new ListViewItem(lvItem);
myListView.Items.Add(myItem);
}

//foreach dongüsü içindeki try/catch blo u bazı süreçlerin(SystemIdleProcess gibi)
//ExecutablePath de erinin olmadı ı dü ünülerek konulmustur. Bu durumda kod hata üretmek
//yerine kontrolün “Executable Path” sütununa deger olarak “not available” girecektir.
//Artık süreçleri sıralayıp ListView da görebildigimize göre seçilen süreci öldüren kodu yazabiliriz:
//myListView kontrolündeki mouse olaylarını izlemek için a a ıdaki olay i eyicisini tanımladık. Bu olay
//tetiklendi i zaman yani kontrol üzerinde mouse hareketi oldugunda, “myListView_mouseDown”
//metodu ça rılacaktır. Bu olay i leyicisi sınıfın InitializeComponent() metodunda tanımlanmalıdır.

this.myListView.MouseDown += new
System.Windows.Forms.MouseEventHandler(this.myListView_mouseDown); //burası tek satır

//artık asıl kodumuza geçebiliriz.

private **** myListView_MouseDown(object sender, MouseEventArgs e)
{
ContextMenu conMenu = new ContextMenu(); //sa mouse tu u tıklandı ında açılacak menü
MenuItem killProcess; //menu içinde yer alacak menuItem
// gerçekle en bir mouse hareketinin sa tu tıklaması olup olmadı ı denetleniyor
if (e.Button == MouseButtons.Right)
{
myListView.ContextMenu = conMenu;
killProcess = new MenuItem();
killProcess.Text = “Terminate Process”;
conMenu.MenuItems.Add(killProcess);
killProcess.Click += new EventHandler(killProcess_Click); // killProcess menu nesnesi
//tıklanıp tıklanmadı ını denetleyecek olay i leyicisi, tıklanırsa killProcess_Click
//metodunu ça ıracaktır.
}
}
private **** killProcess_Click(object sender, EventArgs e)
{
string processID = myListView.SelectedItems[0].SubItems[2].Text;
string processName = myListView.SelectedItems[0].SubItems[0].Text;
string queryString = "SELECT * FROM Win32_Process WHERE ProcessID
='" + processID +"'"; //burası tek satır
ObjectQuery objq = new ObjectQuery(queryString);
ManagementScope ms = new ManagementScope("\\\\"+ MachineName +
"\\root\\cimv2"); //burası tek satır
ManagementObjectSearcher objSearch = new
ManagementObjectSearcher(ms,objq); //burası tek satır
ManagementObjectCollection objqColl ;
objqColl = objSearch.Get();
ListViewItem lvItem;
try
{
foreach (ManagementObject mo in objqColl)
{
mo.InvokeMethod("Terminate",null);
}
lvItem = processList.SelectedItems[0];
lvItem.Remove();
MessageBox.Show(processName +" has been successfully terminated");
}
catch(Exception ex)
{
MessageBox.Show("Error Terminating "+ //burası tek satır
processList.SelectedItems[0].SubItems[0].Text+" because: "+ex.ToString());
}
}
Umarım bu döküman okuyanlara faydalı olur.
İyi çalışmalar...

Görüşleriniz ve paylaşmak istediğiniz diğer bilgiler için:
Mert Süoğlu

 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.