WMI ve Performance Counter kullanarak Network Idle durumunu bulmak

Eskiden sistem destek uzmanı olduğumdan olsa gerek sunucuları her zaman sevmişimdir , hele hele sunucu sistemlerini çok daha fazla sevmişimdir(Windows 2008 favorimdir bu arada). Özelliklede şirketlerde bir şekilde internette gezinmelerde içerik filtreleme olmasından yada çok doğal olarak dosya paylaşım sitelerinden dosya indirmek bir şekilde engellendiğinden (ki bu kararı hem vaktinde uygulamış hemde desteklemiş birisiyimdir) evde her zaman açık bir makine bırakırım. Bir şekilde kendisine erişimi de sağlarım..

Bildiğiniz üzere ülkemizde elektrik ücretleri biraz yüksek , evde sürekli açık bir makine tutmak her ne kadar sadece kasadan ibaret olsada ister istemez bir masraf. Dün okulda dersteyken aklıma şu geldi. Şu an o makinenin açık durmasına ihtiyacım yok , neden açık tutuyorum ki. Sonrada aklıma ya dosya indirmeye bırakmış olsaydım , neye göre kapatacaktım makineyi , tamam bir çok programın dosya indirme bitince kapat özelliği var ama benim istediğim saat aralığında makinenin kapanmasınıda istemiyorum hiç bir şekilde (sabah 9 akşam 18 arası). Sonrada aklıma sistem destek uzmanıyken WMI ile uğraştığım aklıma geldi ve bir şekilde network download speed i alırsam eğer, duruma göre bakarım (saat , hız gibi) ona görede makineye önceden tanımladığım komutu yollarım dedim ve işte karşınıza WMI ve Performance Counters kullanarak hazırladığım Network Idle programı çıktı.

Yukarıdaki karışık anlatımı özetlersek : Program WMI ile açık durumdaki Ağ Bağlantılarını listeliyor , birini seçmenizi istiyor ve size o an ki Bytes Received / Sec bilgisini Performance Counter kullanarak veriyor. Eğer istersenizde belirlediğiniz değerin altına düştüğü anda download hızınız istediğiniz işlemi yapmanızı sağlıyor.

ilk olarak burada WMI a ulaşmak için System.Management Referansını projemize ekliyoruz. Böylece WMI nesnelerine ulaşıp istediğimiz bilgileri alabileceğiz.

Form açıldığında WMI üzerinden tam bir sql cümleciği kullarak Network Adapters isimlerini alıyor.

kullandığımız sorgu cümlesindeki Win32_NetworkAdapters ile ne istediğimizi, where ile tanımladığımız kısımda ise bağlı olan (IP almış,aktif durumdaki) adapterların gelmesini sağlıyoruz.

Listemiz dolduktan sonra uygun adapter seçiliyor ve güzelce performance counter yaratılıyor. PerformanceCounter System.Diagnostics altında yer aldığından onuda using ile ekliyoruz projemize. Bilgisini alacağımız donanım network interface olduğundan önce network interface kategorisine gidiyoruz , hazır gitmişkenke alacağımız değişken tipini belirtiyoruz Bytes Received/sec olarak. Şimdide hangi adapter seçtiysek onun ismini biraz değiştirip PerformanceCounter için instance name olarak belirtiyoruz. Burada isim değiştirmedeki sebebimiz ilginç bir şekilde Device Manager dan bize gelen isim (WMI) ile PerformanceCounter da yazılan isimlerin farklı olması, ilk olarak () işaretleri [] işaretine dönüşüyor. Vista ve Server 2008 de ayrıca / işaretide _ olarak değiştirilip bize sunuluyor. Bu arada bunu Windows XP , Server 2003 , Vista , Server 2008 ayrıca evde kurulu olan Windows Home Server (ki aslında kendisi bir Windows Server 2003 Small Business Server olarak geçer) denedim, Bu şekilde sorun çıkmadı ama sizin sistemlerinizde dil ayarları veya başka bir sebepten değişirse bu isim değişikliğini tekrar ayarlamanız gerekebilir.

Performance Counter da yaratılınca timer nesnemiz devreye giriyor (Thread yazmaktan daha kolay olduğu için bunu kullandım) ve bilgiyi alıp 1024 e bölüp KB ye çeviriyor ve label a yazıyor.

Eğer eşik değeri takip et demişsek, timer bizim için bunuda yapıyor, Seçtiğimiz işleme görede işlemi bir kereliğine yapıyor ve sonrada değerlendirme işlemini durduruyor. Dikkat edelim timer kapanmıyor sadece eşik değer takibini durduruyorum.

Bu kodu ben evdeki sunucuyu iş yapmadığında geceleri kapamak için yazdım (hoş oraya birde saat kontrolü eklemem gerek) siz ne için kullanabilirsinize gelince aklıma ilk olarak bytes received yerine başka bir performance counter kullanarak uzaktaki bir sistemin ağ bağlantısı ile ilgili bilgilere ulaşabilirsiniz yada Win32_NetworkAdapter yerine gene çok sevdiğim Win32_NetworkAdapterConfiguration kullanılarak ağ bilgilerini programınızın içerisine alabilirsiniz yada sürekli dosya göndermesi (web server mesela) gereken bir sunucunuz varsa Bytes Sent bilgisini alıp , veritabanına yazarak, kendi özel loglarınızı oluşturabilirsiniz.

Son olarak WMI sınıfları ve ne gibi bilgiler içerdiği ile ilgili olarak .net developer için kutsal kaynak MSDN de http://msdn.microsoft.com/en-us/library/aa394554(VS.85).aspx adresini kullanabilirsiniz. Performance Counter için ise yapmanız gereken tek şey , Yönetimsel araçlardan Performance ı seçin ve add counter diyerek istediğinize ulaşın.

Aksilik çıkmazsa bir sonraki yazımda artık bir çok projede kullanılmaya başlanan Windows Server 2008 hakkında bir iki detay noktayı anlatan biri olarak karşınıza çıkacağım. O zamana dek iyi günler , iyi çalışmalar.

Projeye ve kaynak koda ulaşmak için :

Leave a Reply