C# dilinin programcılık alanında getirdiği kolaylıklardan biri de WMI (Windows Management Instrumentation-Windows Yönetim Araçları) kullanımıdır. WMI kullanılarak uzaktaki bir bilgisayarla ilgili çalışan uygulamalardan, çalışan servislere, var olan kullanıcı ve gruplara, ekran çözünürlüğüne hatta donanım bilgilerine kadar birçok bilgiye ulaşmak mümkün.
WMI çok iyi gruplandırılmış sınıflardan meydana gelir. Örnek verecek olursak "Win32_Service" sınıfı adından da anlaşılacağı gibi windows servisleriyle ilgili bilgiler verir(Servis adı, açıklaması başlama şekli vb.). Bu ve bunun gibi birçok sınıf farklı farklı bilgileri tutar. Biz de hangi tür bilgiye ihtiyacımız varsa o sınıfı kullanarak ihtiyacımız olan bilgiye ulaşabiliriz. WMI içerisinde kullanılabilecek sınıfların listesine
http://technet.microsoft.com/en-us/library/aa394554(VS.85).aspx
adresinden ulaşabilirsiniz. Dilerseniz küçük bir uygulama ile neler yapabileceğimiz hakkında fikir edinelim. Uygulamamız uzaktaki bir bilgisayara bağlansın ve o bilgisayardaki sürücülerle ilgili bilgileri alsın. Sürücü tabirinden sadece DVD-ROM HDD gibi aygıtları anlamayın. Bilgisayara takılı her donanım parçasının çalışması için sürücü dosyası yüklenmiştir. Bunlarla ilişkilendirilmiş dosyaları kastediyoruz.
Uygulamaya geçmeden önce yukarada verdiğimiz adresteki sınıfları incelemenizde fayda var. Çünkü her sınıf her işletim sisteminde çalışmıyor. Hangi sınıfın hangi işletim sistemi tarafından desteklendiği ile ilgili bilgi her sınıfın kendi sayfasında yazıyor. Biz bu örnek uygulamamızda "Win32_SystemDriver" sınıfını kullanacağız bu sınıfla ilgili açıklamalar
http://technet.microsoft.com/en-us/library/aa394472(VS.85).aspx
adresinde bulunmakta. Sayfanın en alt kısmında ise hangi işletim sistemleri tarafından desteklendiği yazıyor. "Win32_SystemDriver" sınıfının çalışması için istemci bilgisayarlarda en az "Windows 2000 Professional", sunucu bilgisayarlarda ise en az "Windows 2000 Server" yüklü olması şart. Yani Windows XP çalışan bir bilgisayarda bu uygulamayı çalıştıramazsınız. Yine sayfanın alt kısmında DLL dosyası olarak "Cimwin32.dll" dosyasının projemize eklemiz gerekiyor. Dll satırının hemen altında "Namespace" kısmında "root\cimv2" yazdığını göreceksiniz. Bunun kodlarımızın çalışması için önemli olduğunu unutmayın. Eğer farklı bir sınıf ile çalışacaksınız bu kısımda yazanları mutlaka okuyun yoksa saatlerinizi boş yere asla çözemeyeceğiniz bir hatayla uğraşmakla harcarsınız.
Dilerseniz uygulamamıza geçelim. Öncelikle uygulamamıza
using System.Management;
using System.Management.Instrumentation;
namespacelerini ekleyelim. Bu namespaceler WMI kullanımı için gerekli sınıflara ulaşmamızı sağlayacak. Class seviyesinde string bir değişken tanımlıyoruz.
string uzakpc = @\\192.168.2.15\root\cimv2;
Bu değişken bağlanacağımız bilgisayarın adresini tutuyor. IP adresinden sonra ise sınıfın açıklama sayfasının altında yer alan namespace kısmındaki yol bilgisini ekliyoruz. Bu farklı bir sınıf için farklı bir adres olabilir. Sonra bağlantı esnasında kullanılacak ayarları(Kullanıcı adı, şifre vb.) belirliyoruz. Bunun için "ConnectionOptions" sınıfında bir nesne tanımlıyoruz ve bu nesnenin özelliklerini kullanıyoruz.
ConnectionOptions ayarlar = new ConnectionOptions();
ayarlar.Username = "yg.local\\Administrator";
ayarlar.Password = "123456+a";
Bu zamana kadar yaptığımızın özeti, 192.168.2.15 IP adresine sahip bilgisayarda "yg.local" domaininde tanımlı olan "Administrator" kullanıcısına ait kullanıcı adı ve şifresini tanımladık. Şimdi bu makineye bağlanacağız. Bunun içinse "ManagementScope" sınıfından bir nesne tanımlıyoruz. parametre olarak adres bilgisini tutan string değişkenimizi ve ayarlarımızı yaptığımız ConnectionOptions türünden tanımladığımız değişkenimizi veriyoruz ve Connect() fonksiyonunu kullanarak verilen kullanıcı adı ve şifre ile WMI sınıfı ile bağlantı kuruyoruz.
ManagementScope baglanti = new ManagementScope(uzakpc, ayarlar);
baglanti.Connect();
Bağlantı kurulduğuna göre artık sınıfımızla ilgili sorgulama yapabiliriz. Bunun için ObjectQuery türünden bir nesne tanımlıyoruz. parametre olarak bizden sorgu cümlesi istiyor. SQL sorgulaması yapar gibi sorgu cümlemizi oluşturuyoruz.
ObjectQuery sorgu = new ObjectQuery("SELECT * FROM Win32_SystemDriver WHERE State='Running'");
Gördüğünüz gibi SQL komutları kullanılarak hazırlanan bir sorgu cümlesi. Eğer SQL sorgularına aşina iseniz rahatlıkla istediğiniz bilgilere ulaşabilirsiniz.
Sorgu cümlemizi hazırladık hangi bilgisayara bağlanacağımızı tanımladık, kullanıcı adı ve şifre bilgilerini verdik. Şimdi sıra geldi bütün bunları birleştirmeye. Bunun için ManagementObjectSearcher türünden bir nesne tanımlıyoruz. Bu nesneye parametre olarak baglanti ve sorgu nesnelerimizi veriyoruz.
ManagementObjectSearcher arama = new ManagementObjectSearcher(baglanti, sorgu);
Bundan sonraki adımda sorgu sonucunu ekrana yazdıracağız. Bunun için foreach döngü komutunu kullanıyoruz.
foreach (ManagementObject sorgunesne in arama.Get())
{
Console.WriteLine("Win32 Sistem Sürücüleri");
Console.WriteLine(sorgunesne["Name"].ToString());
Console.WriteLine(sorgunesne["Status"].ToString());
Console.WriteLine("-----------------------------------");
}
arama nesnesinin Get() fonksiyonu foreach döngülerinde kullanılabilecek türden bir koleksiyon nesnesi oluşturur. "Name" ve "Status" ile sorgu cümlesinde kullandığımız "State" kavramları bizim seçebileceğimiz şeyler değildir. Bunlar bir tablodaki sütun isimleridir. Diğer sütun isimlerine bakmak isterseniz sınıfın açıklama sayfasında bütün sütun isimlerini bulabilirsiniz.
Hiç yorum yok:
Yorum Gönder