https://www.buraksenyurt.com/Burak Selim Şenyurt - Powershell2017-06-14T19:48:39+00:00Matematik Mühendisi Bir Bilgisayar Programcısının NotlarıBurak Selim SenyurtBlogEngine.Net Syndication Generatorhttps://www.buraksenyurt.com/opml.axdBurak Selim SenyurtMatematik Mühendisi Bir Bilgisayar Programcısının Notlarıtr-TRBurak Selim Şenyurt0.0000000.000000https://www.buraksenyurt.com/post/powershell-ile-bir-seyler-yapmaya-calisan-bir-yazilimciPowershell'i Kurcalayan Bir Yazılımcı2017-06-14T09:27:00+00:00bsenyurt<p><img style="float: right;" src="https://www.buraksenyurt.com/image.axd?picture=/2017/06/powershell_1.gif" alt="" />Merhaba Arkadaşlar,</p>
<p>Powershell betikleri uzun zamandır yaygın ve etkin bir şekilde Windows ailesinde yer almakta. Özellikle sunucu tarafındaki kullanımının öne çıktığını görüyoruz. Temel olarak işletim sistemi üzerinden betik dillerin avantajlarını da kullanarak pek çok işlemin yapılabilmesine olanak sağlayan bir kabuk olarak düşünülebilir. Powershell .Net Framework kütüphanelerini de doğrudan kullanabildiğinden önemli avantajlar sağlamaktadır. Klasör listeleme veya dosya kopyalama gibi çok basit işlemler dışında, n sayıda sunucuya dağıtım paketi çıkacak programcıkların geliştirilmesi benzeri operasyonları da içeren geniş bir yetkinliğe sahiptir. DevOps kültüründe Windows ailesi için değerli ve öne çıkan bir programlama ortamıdır diyebiliriz.</p>
<p>Sistem yöneticilerinin biraz programlama bilgisi ile veya programcıların da biraz sistem bilgisi ile bu dili temel seviyede kullanmaları mümkündür. Elimizdeki Windows 7'den son sürüm Windows Server ailesine kadar pek çok sistemde Powershell betiklerini kullanabiliriz. Geçtiğimiz günlerde bir boşluk yakaladım ve en çok tavsiye edilen Powershell betikleri nelerdir araştırayım dedim. Uzman olmadığım bir alan olsa da tanıma mahiyetinde neler yapılabileceğini görmek istiyordum. Daha önceden Powershell ile üzerinde Gacutil olmayan bir makinede .Net Framework 1.1 ile yazılmış bir kütüphanenin register edilmesi ve eğlence amaçlı olarak Star Wars marşının çaldırılması gibi işlemler yapmıştım ama çok çok daha fazlası olduğunu biliyordum.</p>
<h1>Makinemdeki Servisler</h1>
<p>İlk olarak sistemde yüklü servislerin bir listesini nasıl alırım sorusunun cevabını aradım. Böylece işletim sisteminin yönetsel alanlarından birisine ait bilgilere nasıl ulaşabileceğimi görecektim. Komut satırından Powershell'i açtım ve ilk betiği aşağıdaki gibi yazdım.</p>
<pre class="brush:ps;auto-links:false;toolbar:false" contenteditable="false">Get-Service</pre>
<p>Komutun çıktısı aşağıdaki ekran görüntüsündeki gibi olmuştu.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2017/06/Powershell_2.gif" alt="" /></p>
<p>Makinemde yüklü olan tüm servislerin bilgisini görebiliyordum. Adları<em>(Name)</em>, kısa açıklamaları<em>(Display Name)</em> ve o anki durumları<em>(Status)</em>. Liste gözüme kalabalık görününce acaba bir sorgu atabilir miyim diye kurcalamaya başladım. Belki de adı C harfi ile başlayan servislerin listesini de çekebilirdim. Araştırınca get-service fonksiyonunu aşağıdaki gibi kullanabileceğimi öğrendim.</p>
<pre class="brush:ps;auto-links:false;toolbar:false" contenteditable="false">Get-Service -name C*</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2017/06/Powershell_3.gif" alt="" /></p>
<p>Artık elimde adının ilk harfi C olan servislerin bir listesi vardı. Asteriks kullanımı söz konusu olduğuna göre farklı benzerlikleri de sorgulayabilirdik. Örneğin içinde .NET geçen servisleri bulmak mümkündü. Ne var ki, durum bilgisine göre servisleri bir türlü sorgulayamıyordum. Aynen name parametresi gibi status parametresi üzerinden de sorgu atabileceğimi düşünmüştüm.</p>
<pre class="brush:ps;auto-links:false;toolbar:false" contenteditable="false">get-service -status "running"</pre>
<p>Ancak çalışma sonrası aşağıdaki hata mesajını aldım. status parametresi desteklenmiyordu.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2017/06/Powershell_4.gif" alt="" /></p>
<h1>Yardım Lazımdı</h1>
<p>Peki get-service fonksiyonunun nasıl kullanıldığının bir dokümanı yok muydu? Öğrendim ki get-help komutu ile bir başka powershell komutunun nasıl çalıştığını öğrenebilirim.</p>
<pre class="brush:ps;auto-links:false;toolbar:false" contenteditable="false">get-help get-service</pre>
<p>Bu komutla get-service kullanımına ait yardım içeriğine ulaştım. Komutun ne işe yaradığı, yazım biçiminin nasıl olması gerektiği, parametreleri, genel açıklması ve hatta örnekler sunan yardımcı internet adresli bile vardı.</p>
<pre class="brush:ps;auto-links:false;toolbar:false" contenteditable="false">PS C:\Users\buraksenyurt> get-help get-service
NAME
Get-Service
SYNOPSIS
Gets the services on a local or remote computer.
SYNTAX
Get-Service [[-Name] <string[]>] [-ComputerName <string[]>] [-DependentServices] [-Exclude <string[]>] [-Include <s
tring[]>] [-RequiredServices] [<CommonParameters>]
Get-Service -DisplayName <string[]> [-ComputerName <string[]>] [-DependentServices] [-Exclude <string[]>] [-Include
<string[]>] [-RequiredServices] [<CommonParameters>]
Get-Service [-InputObject <ServiceController[]>] [-ComputerName <string[]>] [-DependentServices] [-Exclude <string[
]>] [-Include <string[]>] [-RequiredServices] [<CommonParameters>]
DESCRIPTION
The Get-Service cmdlet gets objects that represent the services on a local computer or on a remote computer, includ
ing running and stopped services.
You can direct Get-Service to get only particular services by specifying the service name or display name of the se
rvices, or you can pipe service objects to Get-Service.
RELATED LINKS
Online version: http://go.microsoft.com/fwlink/?LinkID=113332
Start-Service
Stop-Service
Restart-Service
Resume-Service
Suspend-Service
Set-Service
New-Service
REMARKS
To see the examples, type: "get-help Get-Service -examples".
For more information, type: "get-help Get-Service -detailed".
For technical information, type: "get-help Get-Service -full".
PS C:\Users\buraksenyurt></pre>
<h1>Where ile Sorguyu Genişlettim</h1>
<p>Gerçekten de get-service komutunun -status gibi bir parametresi mevcut değildi ancak -InputObject parametre kullanımı dikkat çekiyordu. Biraz araştırmadan sonra aşağıdaki gibi bir komut ile DisplayName bilgisinde "Service" kelimesi geçenler hizmetlerden durmuş olanları alabileceğimi gördüm.</p>
<pre class="brush:ps;auto-links:false;toolbar:false" contenteditable="false">Get-Service * | Where-Object {$_.DisplayName -like "*Service*" -and $_.Status -eq "Stopped"}</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2017/06/Powershell_5.gif" alt="" /></p>
<p>Bu komutu anlamak oldukça kolaydı. * ile Get-Service'in döndüreceği tüm servis listesi üzerinde işlem yapacağımızı belirmiştik. | arkasından bir where koşulu geliyordu. Süslü parantezler belli ki bu komutun alacağı kod bloğunu taşıyacaktı. $_. ile başlayan değişkenler ile DisplayName ve az önce alamadığımız Status alanlarına ulaşabiliyorduk. -like benzer , -and mantıksal ve, -eq ise eşitlik anlamında kullanılan komut parametreleriydi<em>(Bu durumda büyüktür veya küçüktürü hatta veyayı nasıl ifade edebileceğimizi de çözmüş oluyoruz)</em></p>
<h1>Döngü Kullanımını Merak Edince</h1>
<p>Internet kaynaklarını tararken dilin pek çok diğer dilde olan temel özelliklere sahip olduğunu görmek kaçınılmazdı. Değişken tanımlamaları, koşullu ifadeler, döngüler vb Hazır elim değmişken bir de döngü yazayım istedim. Örneğin şu an makinede çalışmakta olan Process'lere bakıp Id ve Name bilgilerini ekrana bastırmaya çalıştım.</p>
<pre class="brush:ps;auto-links:false;toolbar:false" contenteditable="false">Get-Process| ForEach-Object{[string]::Format("{0} - {1}",$_.id,$_.name)}</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2017/06/Powershell_6.gif" alt="" /></p>
<p>Burada dikkat çekici noktalardan birisi de .Net kütüphanesinden bir fonksiyona erişilmesiydi. String sınıfının Format metodunu kullandığımız gözünüzden kaçmamış olmalı. [Sınıf Adı]::[Metod Adı] notasyonu ile static tanımlanmış üyelere erişmek mümkün. ForEach-Object komutu ise Get-Process'in ürettiği her bir process nesnesini dolaşmakta. Döngü içerisinde o anki Process'in id ve name bilgilerine nasıl eriştiğimize dikkat edelim.</p>
<h1>Çıktıları Dosyaya Basalım</h1>
<p>Yaptığımız denemelerin sonuçları hep komut satırına basıldı. Anlık olarak iyi olsa da bazen bu çıktıları bir dosyaya basmak ve bir yerlere göndermek de isteyebiliriz<em>(Hatta inanıyorum ki bir powershell işlem çıktısının ürettiği dosyayı otomatik mail ile bir yerlere yollayabilir veya ortak bir ağ klasörüne kopyalatabiliriz. Bir deneyin)</em> Bunun için out-file parametresini eklemek yeterli. </p>
<pre class="brush:ps;auto-links:false;toolbar:false" contenteditable="false">Get-Service * | Where-Object {$_.DisplayName -like "*Service*" -and $_.Status -eq "Stopped"} | out-file "ServiceReport.txt"</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2017/06/Powershell_7.gif" alt="" /></p>
<h1>Bunları Fonksiyon Haline Getiremez miydim?</h1>
<p>Servisler için uyguladığım betiğin çıktısını metin tabanlı bir dosyaya basmış oldum. Pratik görünüyor değil mi? Aslında tam olarak değil. Betikleri fonksiyonelleştirmek yeniden kullanılabilirlik anlamında çok daha mantıklı olabilir. Örneğin servis raporunu çekerken like, status ve dosya kriterlerini parametrik olarak bir fonksiyona almak çok daha işe yarardı. Sonunda aşağıdaki gibi bir şeyler yazılabileceğini gördüm.</p>
<pre class="brush:ps;auto-links:false;toolbar:false" contenteditable="false">function Service-Report ($name="A*",$status="Running",$fileName="Service_Report.txt")
{
Get-Service * | Where-Object {$_.Name -like $name -and $_.Status -eq $status} | out-file $fileName
}
</pre>
<p>Service-Report bir fonksiyon olarak 3 parametre ile çalışmakta. $ işareti ile tanımlanan parametreler metod bloğunda aynı şekilde bir değişken olarak ele alınıyorlar. Dikkat çekici nokta parametrelere varsayılan değer verilebilmesi. Yani name, status ve fileName bilgileri boş geçilirse varsayılan değerleri kullanılacak. Komut satırından bu fonksiyonu çalıştırmak da oldukça kolay.</p>
<pre class="brush:ps;auto-links:false;toolbar:false" contenteditable="false">Service-Report "C*" "Stopped" "Reports.txt"</pre>
<p>Reports.txt dosyasının içinde artık adı C harfi ile başlayan durdurulmuş servislerin bir çıktısı yer alıyor.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2017/06/Powershell_8.gif" alt="" /></p>
<h1>ISE Diye Sevimli Bir IDE</h1>
<p>Bu işlerle uğraşırken komut satırının hem sevimli hem de sevimsiz olduğunu fark ettim. Terminalden çalışmak her zaman için daha keyifliydi ama iş bir betik hazırlamaya geldiğinde basit bir editör hayat kurtarabilirdi. En azından Notepad++ düşünülebilirdi. Çok daha iyisini buldum. Powershell'in ISE<em>(Integrated Scripting Environment)</em> adında bir de kod editörü varmış. Bunun üzerine ISE editörünü açıp içerisine iki fonksiyonellik katıp tools.ps1 adıyla bulunduğum klasöre kayıt ettim.</p>
<pre class="brush:ps;auto-links:false;toolbar:false" contenteditable="false">function Service-Report ($name="A*",$status="Running",$fileName="Service_Report.txt")
{
Get-Service * | Where-Object {$_.Name -like $name -and $_.Status -eq $status} | out-file $fileName
}
function Process-Report($name,$cpuRate,$fileName="Process.txt")
{
Get-Process | where-object {$_.name -eq $name -and $_.CPU -gt $cpuRate} |Format-List * -Force | out-file $fileName
}</pre>
<p>Artık fonksiyonellikleri bir betik dosyası içerisine konumlandırıp komut satırından bu şekilde çalıştırabilirdim. ISE yetenekli bir editör. Betiği yazabildiğimiz arayüzü dışında yine kendi üstünde yer alan komut satırı ile çalışmaların anında denenmesi mümkün. Üstelik çağırılan komutların geriye doğru log'unun tutulduğu bir penceresi de mevcut.</p>
<blockquote>
<p>Bu arada bir ps1 dosyasının yüklenmesi sırasında "...cannot be loaded because the execution of scripts is disabled on this system" şeklinde bir hata alınıyorsa ExecutionPolicy değerinin RemoteSigned olarak değişitirilmesi çözüm olabilir. </p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2017/06/Powershell_9.gif" alt="" /></p>
</blockquote>
<p>ISE editöründe tools.sp1 dosyası içerisindeki fonksiyonların kullanılabilmesi için öncelikde dosyanın sistem çalışma zamanına yüklenmesi gerekiyor. Bir program çalıştırıyor gibi F5 ile veya Debug menüsünden Run/Continue komutları sayesinde bu işlem gerçekleştirilebilir. Dosya başarılı bir şekilde yüklendikten sonra içerisindeki fonksiyonlar kullanılabilir hale gelir. Söz gelimi tools.ps1'i yükledikten sonra sistemde o an açık olan chrome sekmelerinden CPU tüketimi belli bir değerin üstünde olanları bulmak için aşağıdaki ekran görüntüsüne olduğu gibi ilerlememiz yeterlidir. </p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2017/06/Powershell_10.gif" alt="" /></p>
<p>Kimbilir Powershell betikleri ile daha neler neler yapılabilir? Mesela çok fazla bellek tüketen process'lerin belirli kriterlere uyanlarını öldürebilecek, durmuş bir servisi tekrardan ayağa kaldırabilecek betikler yazabilir, ağ üzerinden ulaşılabilecek uzak sunucular hakkında anlık durum bilgilerine sahibi olabiliriz. Sistem üzerinden gerçekleştirilecek tüm bu operasyonlarda sadece bu alana özel yazılmış bir betik dilin programlama özelliklerine sahip olmak da işin cabası.</p>
<p>Bu yazıdaki anafikre göre kısa zamanda öğrenilebilecek bir betik dil ile işletim sistemi üzerinde hakimiyet sağlayıp pek çok işi otomatize edecek geliştirmeler yapabileceğimizi düşünebiliriz. İşte böyle sevgili okuyucu. Bir boşluğu iyi değerlendirmek adına Powershell ile yaptığım bir kaç saatli maceralarımı kısaca anlatmaya çalıştım. İşi daha da ileri götürmek mümkün. Ara ara burada betikler yazılabilir. <a href="https://www.amazon.com/s/ref=sr_st_date-desc-rank?keywords=powershell+scripting&rh=i%3Aaps%2Ck%3Apowershell+scripting&qid=1497268080&sort=date-desc-rank" target="_blank">Amazon'da konu ile ilgili pek çok kitap</a> var ama şuradaki <a href="http://powershelltutorial.net/" target="_blank">online tutorial seti</a> de epey işe yarar görünüyor. Bir başka yazımızda görüşmek dileğiyle hepinize mutlu günler dilerim.</p>2017-06-14T09:27:00+00:00powershellscript languagesscriptingbetik dillershell programmingbsenyurtAslında Powershell betikleri uzun zamandır yaygın ve etkin bir şekilde kullanılıyor. Sistem yöneticilerinin biraz programlama bilgisi ile veya programcıların da biraz sistem bilgisi ile bu dili temel seviyede kullanmaları mümkün. Elimizdeki Windows 7'den son sürüm Windows Server ailesine kadar pek çok sistemde Powershell betiklerini kullanabiliriz. Geçtiğimiz günlerde bir boşluk yakaladım ve en çok tavsiye edilen Powershell betikleri nelerdir öğrenmek istedim. Uzman olmadığım bir alan olsa da tanıma mahiyetinde neler yapılabileceğini görmek istiyordum.https://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=6981d6a5-46ec-4074-b781-c157285016fa0https://www.buraksenyurt.com/trackback.axd?id=6981d6a5-46ec-4074-b781-c157285016fahttps://www.buraksenyurt.com/post/powershell-ile-bir-seyler-yapmaya-calisan-bir-yazilimci#commenthttps://www.buraksenyurt.com/syndication.axd?post=6981d6a5-46ec-4074-b781-c157285016fahttps://www.buraksenyurt.com/post/tek-fotoluk-ipucu-134-powershell-den-soap-based-web-service-cagirmakTek Fotoluk İpucu 134 - Powershell'den XML Web Service Çağırmak2016-10-06T21:10:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Olmaz olmaz demeyin, gün gelir ihtiyacınız olur :) Ortada bir XML Web Service olduğunu düşünelim ve onu çağırmak istediğimiz bir sunucunun başında oturduğumuzu. Sunucu üzerinde SOAP-UI gibi yardımcı araçların olmadığını ve bunları kurma yetkinizin de bulunmadığını düşünün. Öyle bir sunucu ki komut satırı en etkili araç. İşte böyle bir durumda Windows PowerShell gibi araçlar web servislerini çağırma noktasında işimize yarayabilir. Nasıl mı? Gelin bakalım.</p>
<p>Elimizde ASP.Net ortamında geliştirilmiş CalculationService.asmx isimli bir XML Web Service olduğunu ve içerisinde Sum isimli basit bir toplama operasyonu bulunduğunu varsayalım <em>(Sum operasyonuna ait SOAP 1.1 temelli HTTP Post talebinin şablonu aşağıdakine benzerdir)</em></p>
<pre class="brush:xml;auto-links:false;toolbar:false" contenteditable="false">POST /CalculationService.asmx HTTP/1.1
Host: localhost
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.buraksenyurt.com/servicebag/Sum"
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Sum xmlns="http://www.buraksenyurt.com/servicebag/">
<x>double</x>
<y>double</y>
</Sum>
</soap:Body>
</soap:Envelope></pre>
<p>PowerShell'de bu tip SOAP tabanlı servisleri Proxy sınıfı tanımlayarak çağırabilir ve operasyonlarını test edebiliriz. Bunun için New-WebServiceProxy komutundan yararlanıyoruz.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/10/TFI_134.gif" alt="" /></p>
<p>$URI değişkeni çağırmak istediğimiz web servisine ait WSDL(Web Service Description Language) adresini taşıyor. Sonrasında $proxy değişkenine New-WebServiceProxy tipi ile ürettiğimiz proxy nesnesini atıyoruz. Powershell tarafında kullanacağımız namespace ve class adlarını belirtiyoruz. Sonrasında $proxy değişkeni üzerinden web servis operasyonlarını çağırabiliriz. Servise ait diğer operasyonları görmek isterseniz aşağıdaki komutu da kullanabilirsiniz.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">$proxy | Get-Member -MemberType method</pre>
<p>Görüldüğü gibi sanki .Net ortamında bir istemci kodundaymışız gibi ilgili servisi çağırabildik. Ancak çok daha karmaşık senaryolar olduğunu da ifade edebiliriz. Örneğin servis operasyonları primitive tipler yerine complex tipler ile çalışıyor olabilir. Örneğin kategori bazlı ürün listesini döndüren bir servis operasyonunu Windows PowerShell üzerinden çağırmayı deneyebilirsiniz. Bunu nasıl yapabileceğinizi araştırmanızı öneririm.</p>
<p>Bir başka ipucunda görüşmek dileğiyle hepinize mutlu günler dilerim.</p>2016-10-06T21:10:00+00:00powershellxml web servicesoapproxyhttp postsoap based web servicecommand promptc#bsenyurtOlmaz olmaz demeyin, gün gelir ihtiyacınız olur :) Ortada bir XML Web Service olduğunu düşünelim ve onu çağırmak istediğimiz bir sunucunun başında oturduğumuzu. Sunucu üzerinde SOAP-UI gibi yardımcı araçların olmadığını ve bunları kurma yetkinizin de bulunmadığını düşünün. Öyle bir sunucu ki komut satırı en etkili araç. İşte böyle bir durumda Windows PowerShell gibi araçlar web servislerini çağırma noktasında işimize yarayabilir. Nasıl mı? Gelin bakalım.https://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=d826bad5-2991-4967-9792-705b7f5d78632https://www.buraksenyurt.com/trackback.axd?id=d826bad5-2991-4967-9792-705b7f5d7863https://www.buraksenyurt.com/post/tek-fotoluk-ipucu-134-powershell-den-soap-based-web-service-cagirmak#commenthttps://www.buraksenyurt.com/syndication.axd?post=d826bad5-2991-4967-9792-705b7f5d7863