Managed WMI Sınıfları Oluşturma

17. August 2006

     C# ile WMI kodu yazıyorsanız ManagementScope, ManagementObjectSearcher, ManagementObjectCollection ve tabiki ManagementObject sınıflarına sık sık başvurmuşsunuzdur; ama bu sınıflarla çalışmak her zaman kolay değildir, özellikle de fonksiyonlarını kullanıyorsanız. Aşağıdaki koda göz atın :

private void List(string alanAdi) {
  string sorgu = String.Format("SELECT * FROM MicrosoftDNS_AType WHERE ContainerName = '{0}'", alanAdi);
  ManagementScope managementScope = new ManagementScope(new ManagementPath(@"\\.\root\MicrosoftDNS"));
  managementScope.Connect();

  ManagementObjectSearcher objectSearcher = new ManagementObjectSearcher(managementScope, new ObjectQuery(sQuery));
  ManagementObjectCollection objectCollection = objectSearcher.Get();
 
  foreach (ManagementObject managementObject in objectCollection) {
   //gelen nesne ile ilgili iş mantığı
  }
}

       Şimdi size iyi bir haberim var; .Net framework araçları arasında bulunan "Management Strongly Typed Class Generator" (Mgmtclassgen.exe) işlerinizi oldukça kolaylaştıracaktır. "<Program Files>\Microsoft Visual Studio 8\SDK\v2.0\Bin\" dizini altında bulabileceğiniz "mgmtclassgen.exe" uygulaması, parametrelerinde vereceğiniz WMI sınıfı üzerinde rahatlıkla işlem yapabileceğiniz managed kodları üretecektir.

    Bu uygulamayı en basit aşağıdaki şekilde çalıştırabilirsiniz :

mgmtclassgen.exe Win32_Service

    Bu komut size Win32_Service WMI sınıfı üzerinde çalışabilmek için ara bir managed sınıf üretecektir. İşte size daha detaylı bir başka örnek

mgmtclassgen Win32_Service /n root\cimv2 /l CS /p c:\servisler.cs

    Bu örnekte Root\cimv2 isim uzayı altında bulunan Win32_Service sınıfı üzerinde işlem yapabileceğiniz sınıfı oluşturu ve çıktıyı "c:\servisler.cs" dosyasına yazar. Oluşturduğu sınıfın bulunacağı isim uzayı ise ROOT.CIMV2.Win32 olacaktır. Kullanabileceğiniz diğer parametreler ise :

/L Oluşturulacak olan kodun hangi dotnet dilinde olacağı. CS, VB, JS, VJ, MC seçeneklerinizden varsayılan olan CSharp (CS)'tir.
/M Bağlanılacak olan makine adı, varsayılan değeriyerel makinedir.
/U Kullanıcı Adı
/PW Kullanıcı Şifresi

   mgmtclassgen uygulamasını yukarıda verdiğim örnek içerisindeki AType WMI sınıfı için kullanılacak olursak; aynı işi , oluşturulan managed kodu ile, aşağıdaki kadar basit şekilde yapabilirsiniz :

private void List(string alanAdi) {
  foreach (AType atype in AType.GetInstances(String.Format("SELECT * FROM MicrosoftDNS_AType WHERE ContainerName = '{0}'", alanAdi))) {
    //İş mantığı kodu buraya yazılacak
  }
}
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Türkçe, C#, WMI ,

Web Servislerinde WMI Kullanımı

13. August 2006
   Bir süredir aklımda, No-IP ve benzeri servislerin yaptığı gibi, sabit bir ip adresine sahip olmayan istemcilerin bir dns sunucusu üzerindeki uygulamaya bağlanarak ip adreslerini bildirmeleriyle otomatik olarak DNS kayıtlarının güncellenmesini sağlamak ve bu sayede dışarıdan her an bu istemcilere ulaşabilmek fikri var.

   Bunun için biraz araştırma yapınca ihtiyacım olan şeyin WMI olduğunu buldum. Birçok farklı kullanımı olan WMI'yın "root\MicrosoftDNS" isim uzayı altındaki (üzerine DNS kurulmuş olan Windows sunucularda bulunur) "MicrosoftDNS_AType" sınıfı tamda ihtiyacım olan şeymiş.

   C# ile hazırladığım windows uygulamasını wmvare üzerine kurduğum sanal makineyle test ettiğimde sorunsuz olarak AType tablosundan verilerimi alabildim; aynı tablo üzerindeki deneme alt etki alanına ait ip adreslerini de güncellemeyi başardım. Firewall'lara takılmak istemediğim için 80'ıncı port üzerinden yayınlanacak web servisi yazmak oldukça mantıklı geldi.; fakat servisimi yazıp sunucuma koyduğumda "Generic Error" ("Genel Hata") şeklinde bir hata mesajıyla karşılaştım ki ne olduğu hakkında hiç bir ipucu vermeyen sayılı hata mesajlarından biridir

  Hata hakkında daha detaylı bilgi edinebilmek için "C:\WINDOWS\system32\WBEM\Logs" dizini altındaki wbemcore.log dosyasına baktığımda "NT AUTHORITY\NETWORK SERVICE" kullanıcısıyla işlem yapıldığını gördüm. "Bilgisayar Yönetimi"nde WMI düğümüne giderek güvenlik sekmesi altından "root\MicrosoftDNS" düğümünde bu kullanıcıya tam yetki verdim. Tekrar web servisimi denedim; ama sonuç değişmedi

   Windows uygulamamda çalışan kodumun web servisinde çalışmamasının tek sebebini yetki olarak düşündüm. Son olarak kullanıcı gruplarına giderek "NETWORK SERVICE" kullanıcısını da sistem yöneticileri arasına ekledim. Web servisimi tekrar denediğimde bu sefer istedim sonucu aldım ve DNS kaydım güncellendi.

   Şimdilik bu problemimi çözdü; fakat iyi bir çözüm değil
   Bu problem üzerinde hala çalışıyorum. Başka bir çözümü olan varsa seve seve dinleyebilirim
Digg It!DZone It!StumbleUponTechnoratiRedditDel.icio.usNewsVineFurlBlinkList

Türkçe, WMI