System.Management.Automation İsimuzayı

Eyl 06, 2013

System.Management.Automation .NET üzerinde PowerShell betikleri çalıştırmak için kullanılan bir arayüzdür. Bu arayüz sayasinde, çalışma alanları (runspace) açılabilir, iş hatları (pipeline) oluşturulabilir ve iş hattına dizilen komutlar ya da betikler çalıştırılabilmektedir. İsimuzayı içerisindeki temel sınıflar aşağıdaki gibidir:

  • Runspace (Çalışma Alanı): İlgili betiklerin ya da komutların üzerinde çalışacağı alan için kullanılır. Bu sınıftan bir nesne RunspaceFactory (Çalışma Alanı Fabrikası) sınıfı üzerinden fabrika tasarım kalıbı kullanılarak oluşturulur.
  • Pipeline (İş Hattı): Betiklerin ya da komutların çalıştırılmak amacıyla üzerine dizilen yapıdır. Pipeline nesnesi, içinde bulunacağı çalışma alanı kullanılarak üretilir.
  • Command (Komut): Pipeline üzerine dizilecek komut nesnesidir. Pipeline üzerinde çalışacak komutlar nesne olarak dizilebilmekte ya da script (betik) olarak eklenebilmektedir.
  • CommandParameter (Komut Parametresi): Bu sınıftan oluşturulan nesneler çalıştırılacak komuta ya da betiğe gönderilecek parametreler için kullanılır. Parametreler, komutlara doğruduan, betiklere ise iş hattına dizildikten sonra eklenebilmektedir.
  • PSObject (PS Nesnesi): Çalıştırılan komutlardan ya da betiklerden geriye dönecek nesneleştirilmiş değerlere ulaşmak için kullanılır. Genelde komutlarda ve betiklerde birden çok sonuç döndürüldüğünden ya da iş hattında birden çok komut olduğundan sonuçlar Collection (Koleksiyon) nesnesi gibi liste olarak yakalanmaktadır.

Uygulama:

Bu uygulamada tek parametre alan ve parametreye göre işlemci yükünü ve adını ya da mevcut ve boş bellek miktarını döndüren bir betik kullanılmıştır. Betik üretilen iş hattına eklenmiş ve sonrasına ilgili parametre (işlemci ya da bellek) bağlanmıştır.

Kullanıcının görüntüleyeceği bilgiyi seçeceği açılır kutu ve gönderme düğmesinden oluşan arayüz (ASP.NET) kodları aşağıdaki gibidir:

<div>
    <table>
        <tr>
            <td>Bilgi:</td>
            <td>
                <asp:DropDownList ID="ddlIstek" runat="server">
                    <asp:ListItem Text="Seçiniz" Value="" />
                    <asp:ListItem Text="Bellek Durumu" Value="bellek" />
                    <asp:ListItem Text="İşlemci Durumu" Value="islemci" />
                </asp:DropDownList>
            </td>
        </tr>
        <tr>
            <td></td>
            <td>
                <asp:Button ID="btGonder" runat="server" Text="Göster" 
                onclick="btGonder_Click" />
            </td>
        </tr>
    </table>
    <br />
    <asp:Label ID="lbBilgi" runat="server" />
</div>

Bilgiyi görüntülemek için ilgili düğmeye tıklandığında arka planda çalışacak olay (event) aşağıda belirtilmiştir. Bu olay, çalışma alanını ve iş hattını üretir. İlgili betiği iş hattına dizer ve gerekli parametreleri ekledikten sonra iş hattını çalıştırır. Sonuçları koleksiyon olarak yakalar ve ekrana yazdırır.

 

protected void btGonder_Click(object sender, EventArgs e)
{
    string istek = ddlIstek.SelectedValue.ToString();
    string script =
    @"param
    (
                [string]$request,
                [string]$computer = $env:ComputerName
    )
    $result = @{}

    if ( $request -eq ""bellek"")
    {
                $result[""fiziksel""] = ( Get-WMIObject Win32_OperatingSystem -ComputerName 
                                               $computer).TotalVisibleMemorySize
                $result[""mevcut""] = ( Get-WMIObject Win32_OperatingSystem -ComputerName 
                                                $computer).FreePhysicalMemory            
                $resultObj = New-Object PSObject -Property $result
                $resultObj
    }
    elseif ( $request -eq ""islemci"")
    {
                $result[""tanim""] = ( Get-WMIObject -class Win32_Processor ).Description
                $result[""yuk""] = ( Get-WMIObject -class Win32_Processor ).LoadPercentage

                $resultObj = New-Object PSObject -Property $result                $resultObj
    }
    else
    {
                write-host ""parametre hatası""
    }";             

    Runspace calismaAlani = RunspaceFactory.CreateRunspace();
    calismaAlani.Open();

    using (Pipeline isHatti = calismaAlani.CreatePipeline())
    {
        isHatti.Commands.AddScript(script);
        isHatti.Commands[0].Parameters.Add(new CommandParameter("request", istek));

        Collection<PSObject> sonucKumesi = new Collection<PSObject>();
        sonucKumesi = isHatti.Invoke();

        foreach (PSObject sonuc in sonucKumesi)
        {
            if (istek == "bellek")
                lbBilgi.Text = "Mevcut Bellek: " + sonuc.Properties["mevcut"].Value + 
                                    " Toplam: " + sonuc.Properties["fiziksel"].Value;
            else if (istek == "islemci")
                lbBilgi.Text = "İşlemci Yükü: %" + sonuc.Properties["yuk"].Value + 
                                    " İşlemci Adı: " + sonuc.Properties["tanim"].Value;
        }
    }
    calismaAlani.Close();
}

İnternet sitesi çalıştırıldığında aşağıdaki gibi bir çıktı üretmektedir: