HTML Reporting with PowerShell – Part 1

By | 18 February 2018

Merhaba, yine bir powershell serisi ile karşınızdayım :) Tabi bu sefer ki çok uzun bir seri olmayacak :) Uzun zamandan beri makalesini yazmak istiyordum, kısmet bu güneymiş.

HTML bir ITpro olarak yazdığım script’lerin sonuçlarını gösterme kısmında oldukça işime yaran bir teknoloji olmuştur. Çok öncelerde ilkel metodlar kullanarak oluşturduğum bu HTML dosyaları daha sonralarda daha kolay ve özelleştirilebilir hale geldi diyebilirim.

PowerShell mimarisinde komut yada scriptlere ait çıktıların HTML formatında olması kolay şekilde mail olarak gönderilmelerine, esnek olmalarına ve plain-text çıktılara göre daha güzel görünmelerine neden olur.

HTML ile daha önceden çalışmamışsanız çok basit olarak bir HTML dosyası içerisindeki tag’ların ne anlama geldiğini öğrenmenizi öneririm. Çok zor değil. Ben basit olarak bir kaç temel tag’dan bahsetmeye çalışacağım.

Bir HTML dökümanının temelde bir <html> tagı ile başlayıp </html> tagı ile sonlanması gerekir. Bu amaçla oluşturulacak dökümanda dikkat edilecek ilk nokta bu olmalıdır.

HTML dökümanı içerisinde <table>,<td>,<head>,<body> vb bir çok tag barındırır. Bunların anlamları da karmaşık değildir. Örneğin <table> tabloyu ifade ederken <td> tabloya ait hücreleri ifade eder.

HTML dosyalarında önemli olan bölümlerden birisi <head></head> tagları arasında kalan bölümdür. Bu bölümün içerdikleri browser’da görünmezler, browser üzerinde görüntülenecek bölüm <body></body> tagları arasındaki bölümdür. <head> bölümü genelda sayfaya ait meta-data’yı içerir. Bu metadata browser tabındaki başlığı, sayfaya attach edilmiş style yada scriptleri içerir. Kısacası sayfanın güzel görünmesini sağlayan bileşenlerin tanımlandığı bölüm burasıdır.

Temel olarak ele aldığımız bu HTML bilgisinin ardından PowerShell ile birlikte gelen ConvertTo-Html cmdlet’ini kullanmaya başlayabiliriz. Daha önceden ele aldığım makalelerde bu cmdlet’I anlatmıştım. Bu seride biraz daha derinlemesine ele alacağım.

Basit bir komut ile HTML çıktı oluşturup yapısını inceleyelim.

System loglarını görüntülemek için aşağıdaki komutu kullanalım. Komutun powershell konsolu üzerindeki çıktısı aşağıdaki gibidir.

Get-EventLog -LogName “System” -EntryType Error -Newest 10

Resim-1

Şimdi ConvertTo-HTML cmdlet’ini kullanarak çıktıyı HTML formatında kaydedelim.

Get-EventLog -LogName “System” -EntryType Error -Newest 10| ConvertTo-Html > WULogs.html

Komut çalıştırılıp çıktı kayıt edildikten sonra HTML dosyayı herhangi bir browser ile açtığımızda aşağıdaki gibi bir tablo görünecektir. Plaintext çıktılara göre oldukça okunabilir bir formattadır.

Resim-2

Oluşturduğumuz HTML dosyasının içeriğini kontrol ettiğimizde HTML için gerekli olan tüm bileşenlerin powershell tarafından oluşturulduğunu görebilirsiniz.

Resim-3

ConvertTo-HTML komutu ile oluşturduğumuz HTML tabloya ait verileri özelleştirmeniz de mümkündür. Şimdi aşağıdaki komutu çalıştırıp farka göz atalım.

Get-EventLog -LogName “System” -EntryType Error -Newest 10 | ConvertTo-Html –Property MachineName ,EventID, TimeGenerated –Title “Windows PowerShell Log Information” > WULogs2.html

Komut ile HTML convert işlemi yapılırken belirli property’lerin gelmesini sağlayıp, HTML’e ail title property’sini de komutu çalıştırırken atamış olduk. (Bir önceki örnekte bu kısmı kontrol etmediğimiz için default olarak “HTML TABLE” başlığı title olarak atanmıştı.)

Komutun ardından HTML çıktısı aşağıdaki gibidir.

Resim-4

Convert-ToHTML cmdlet’I ile HTML çıktılarını basit olarak bu şekilde filtrelemiş olduk.

Bir HTML dosyası birden fazla tablo içerdiği durumlarda konfigürasyon biraz daha farklı bir hal alır. Bu kofigürasyon yapılırken genel olarak yapılan bir yanlış vardır. Şimdi önce bu yanlış yapılandırmaya göz atalım. Ardından doğrusunun nasıl olması gerektiğini anlatalım.

Örneğin bir makinanın işletim sistemi ve bios bilgilerini HTML bir dosya olarak kaydetmek istediğimizde genel olarak aşağıdaki yanlış yapılır.

Aşağıdaki örneğe göre ilk önce ilk komut çalıştırılıp HTML bir dosya olarak çıktı kaydedildikten sonra, ikinci komut çalıştırılıp yine ConvertTo-HTML komutu ile aynı dosyaya ikinci komuta ait çıktılar kaydedilir. Yani çıktılar aynı dosya üzerine iki kez HTML olarak dönüştürülür.

Get-WmiObject -class Win32_OperatingSystem | ConvertTo-HTML | Out-File report.html

Get-WmiObject -class Win32_BIOS | ConvertTo-HTML | Out-File report.html -append

Bu işlem sonucunda çıktı aşağıdaki gibi görünür. İlk bakışta çıktı hatalı değil gibidir.

Resim-5

Ancak HTML dökümanına göz atıldığında dökümanın yapısının sıkıntılı olduğu anlaşılır. Dökümanın içerisinde iki ayrı <html> bölümü vardır ve bu daha önce bahsettiğimiz gibi yanlış bir konfigürasyondur.

Resim-6

Bu yanlış konfigürasyonu düzeltmek için yapmamız gereken birden çok bölüm içeren HTML dökümanlarını oluştururken, her bölümü fragment komutu ile oluşturup tek bir convertto-html komutu kullanmaktır.

Bu sebeple böyle bir durumda olması gereken aşağıdaki gibidir.

$OS = Get-WmiObject -class Win32_OperatingSystem | ConvertTo-HTML -Fragment

$Bios = Get-WmiObject -class Win32_BIOS | ConvertTo-HTML -Fragment

ConvertTo-HTML -Body “$OS $Bios” -Title “Report” | Out-File PCReport.html

Komut çalıştırıldığında farklı bölümler –Fragment parametresi ile kaydedilip toplu olarak HTML’e convert edilir.

Bu komutların ardından HTML dosya kontrol edildiğinde tek bir <html> tagına sahip olduğu görülecektir.

Resim-7

İlk bölümde basit olarak HTML yapılarını,convertto-html cmdlet’ini ve multisenction html komutlarının nasıl oluşturulması gerektiğini ele almış olduk.

Bir sonraki bölümde tabloları css dosyaları ile nasıl daha görsel hale getirebileceğinizi anlatacağım.

Bir sonraki makalede görüşmek üzere.

Fırat

Leave a Reply