PHP ile windows wmi yönetim araçlarına erişim

Windows wmi ( Windows Management Instrumentation ) windows işletim sistemindeki her nesnenin kontrolünü sağlayan bir interfacedir . WMI ile windows desktop ile yaptığımız herşeyi yapabiliriz . Windows wmi servisini PHP , C# , C++ , VB.NET , JAVA gibi bir çok dil ile yazılım geliştirebiliriz .

Windows wmi servisi ile yapabileceğimiz birkaç örneği şöyle sıralayabiliriz .

  • İşletim sistemini kapatabiliriz
  • İşletim sisteminin adını domain etki alanını yada disk sürücülerini öğrenebiliriz .
  • İşletim sistemi üzerindeki herhangi bir servisi çalıştırabilir yada durdurabiliriz .
  • DNS sunucusu üzerinde update delete insert ve select gibi birçok query çalıştırabiliriz
  • İnternet information service üzerindeki domain listesini alabilir yeni bir domain oluşturabiliriz ,
  • PHP sayfasından windows sunucusunun arkaplan resmini yada rengini değiştirebiliriz .
  • PHP sayfası üzerinden windows sunucusunun ip adresini öğrenebilir yeni ip ekleyebilir mevcut ip adresini değiştirebilir yada network adaptörünü disable yada enable edebiliriz .

Kısacası yukarıda yazdığım programlama dilleri ile windows sunucusunu tamamen yönetebiliriz . Windows WMI interfacesi ile yapılan ve en bilinen yazılımlardan birisi Parallels Plesk paneldir . Plesk panel windows versiyonu %70 windows wmi altyapısı ile işlemlerini gerçekleştirmektedir .

Plesk panelde bir domain oluşturduğunuzda wmi microsoftIIS servisine bağlanır ve girmiş olduğunuz domain wmi arayuzu tarafından create edilir . Aynı şekilde dns servisi mail servisi ( mail servisi wmi yapısını destekliyorsa ) bu yapı ile oluşturulmaktadır .

Windows WMI interfacesi sadece windows servislerini değil diğer yazılımlarıda kontrol edebilmektedir . Örnek chrome internet tarayıcısına wmi ile yani bir sayfa açtırabilirsiniz .Tabi kullanılacak yada yönetilecek yazılımların windows wmi interfacesini desteklemesi gerekmektedir .

Windows wmi servisini kullanma amacınıza göre işletim sistemini seçmeniz gerekmektedir . DNS IIS Active Directory gibi servislerii kullanmanız gerekiyorsa 2003R2 üzeri bir Windows server işletim sistemi seçmeniz gerekmektedir aksi halde wmi interface çalışmayacaktır .

Şimdi WMI servisini nasıl kullanacağımızı ve wmi servislerini nasıl aktif edeceğimize bakalım .

Test amaçlı kullandığım işletim sistemi Windows server 2012 dir .

Test amaçlı kullandığım client işletim sistemi Windows 8.1 dir .

Windows server 2012 WMI servislerini aktif hale getirelim . Aşağıdaki resimdeki gibi advanced setting bölümüne girelim .

windows_wmi_1

Yukarıdaki resimdeki Web management Ins servislerinin hepsini enable konumuna getirin .

Sunucu üzerinde wmi servisini aktif kullanılabilir hale getirdik . Şimdi ise Client bilgisayardan sunucuya bağlanalım ve sunucunun disk sürücülerini görüntüleyelim .

client üzerinden bir wmi servisine bağlanmak için bir test aracı mevcuttur . Başlat bölümüne wbemtest yazarak bu aracı çalıştrabiliriz .

windows_wmi_2

Bağlan diyerek windows server 2012 sunucusuna bağlanacağız . Benim sunucumun IP adresi 192.168.0.15 .

windows_wmi_3

Uzak wmi interfacesine bağlanmak için \\IPADRESI\root\cimv2 ile bağlanabilirsiniz . Eğer local bilgisayara bağlanmak istiyorsanız root\cimv2 yazmanız yeterlidir . Uzak bir bilgisayara bağlanırken dikkat etmeniz gerekn bir hususta Kullanıcı adı ve parolasını girmenizdir . Aksi halde erişim engellendir uyarısı alırsınız .

Eğer wmi ile başarılı bir şekilde sunucuya bağlandı iseniz aşağıdaki gibi uygulama çalışacaktır . Burada windows server 2012 sunucumuz üzerinde işlem yapmaya yarayan filtreleri kullanacağız .

windows_wmi_4

Hemen windows sunucumuzun disk yapısına göz atalım . Sorguları yazmak için Sorgu… bölümünü açalım ve aşağıdaki filtre kodunuz yazalım .

windows_wmi_5

Karşımıza disk yapısını gösteriyor . İşlem bu kadar . Tabi bu küçük bir uygulama , windows wmi interfacesi içerisinde binlerce nesne bulunuyor ve bu nesneleri wmi ile yönetebiliriz .

windows_wmi_6

Yukarıda basit ama iyi bir yol gösterici uygulama yaptık . Şimdi ile PHP sayfasından sunucunun disk kullanım bilgilerini gösteren bir uygulama yapalım . PHP ile wmi intercafesini kullanabilmemiz için php_com_dotnet.dll eklentisine ihtiyacımız var . php_com_dotnet.dll eklentisi unutmayın ki sadece windows tabanlı sunucularda çalışır yani bir linux sunucusu üzerine bu eklentiyi tanımlarsanız wmi interfacesine bağlanamaz ve hata alırsınız .

php_com_dotnet.dll eklentisini php.ini içerisine tanımlamak için php.ini dosyasının en alt satırına

[COM_DOT_NET]
extension=php_com_dotnet.dll

yapıştırmanız yeterlidir ve IIS web sunucusunu restart etmeniz gerekmektedir .

eğer işlemleri başarıyla tamamladıysanız windows sunucunuzun inetpub>www klasörüne index.php dosyası oluşturun ve aşağıdaki php kodlarını yazın .

[php]

<?php

$pc = ".";
$obj = new COM ("winmgmts:\\\\".$pc."\\root\\cimv2");

$disks = $obj->ExecQuery("Select * from Win32_LogicalDisk");

foreach ($disks as $d)
{
$str=sprintf("%s (%s) %s bytes, %4.1f%% free\n", $d->Name,$d->VolumeName,number_format($d->Size,0,’.’,’,’), $d->FreeSpace/$d->Size*100.0);

echo $str;
}

?>

[/php]

Evet burada kullandığımız bağlantı şekli local bağlantıdır . Ne demek bu şöyle açıklayayım . wbemtest aracı ile client bilgisayardan windows server 2012 sunucusundaki wmi interfacesine bağlanmış ve query çalıştırmıştık . PHP kodunda ise client bir pc den değilde direk windows server sunucumuzun localhost IIS sine koyduk . PHP sorguyu çalıştırırken lokale bağlanıp root/cimv2 namespace ile bağlantı . sonuç aşağıdaki gibi . Tabi genede siz sunucuya istediğiniz client bir bilgisayardan da bağlanabilirisiniz . Örnek : http://192.168.0.15/wmi.php
Windows server içerisinden bağlanmak için http://localhost/wmi.php

windows_wmi_7

Eğer php kodunuz client bilgisayarda ve uzaktaki bir wmi interfacesine bağlanmak istiyorsanız aşağıdaki gibi bağlanabilirsizin .

[php]

<?php

$pc = "192.168.0.15"; // Uzak wmi ip adresi

$WbemLocator = new COM ("WbemScripting.SWbemLocator");
$WbemServices = $WbemLocator->ConnectServer($pc, ‘root\\cimv2’, ‘Server Kullanıcı Adı’, ‘Server Parolası’);
$WbemServices->Security_->ImpersonationLevel = 3;

$disks = $WbemServices->ExecQuery("Select * from Win32_LogicalDisk");

foreach ($disks as $d)
{
$str=sprintf("%s (%s) %s bytes, %4.1f%% free\n", $d->Name,$d->VolumeName,number_format($d->Size,0,’.’,’,’), $d->FreeSpace/$d->Size*100.0);

echo $str;
}

[/php]

Sonuç olarak windows sunucu üzerinde wmi servislerinin nasıl aktif hale getirileceği ve bu servislerin wbemtest aracı ile nasıl test edilebileceğini gördük . Son olarak ise PHP sayfası üzerinden local ve remote wmi sorgularını çalıştırmayı ve sonuçları yazdırmayı gördük . WMI servisleri çok kapsamlı ve karışık bir yapıdır . WMI servisleri üzerinde hakim olabilmeniz için aşağıdaki linkteki WMI codeGenerator yazılımını incelemenizde fayda var . Bu yazılım sunucu üzerinde kullanılabilecek tüm wmi sınıflarını listeleyip C# programlama dilindeki karşılığını gösterme yeteneğine sahiptir .

WMI code Generatır indir

Yararlı olması dileğiyle
Rahim CAN