Invoke-Command ile Parametre Kullanımı
En iyi sistem yöneticisi gündelik operasyonel görevlerini scripte eden sistem yöneticisidir.Doğal olarak güncelik işlerimizi scripte döküp mümkün olduğunca elle yapmaktan kaçınırız. Powershell sayesinde uzaktaki bir sunucuya bağlanıp istediğimiz komut veya scriptleri çalıştırabiliriz. Ben genelde yazmış olduğum scriptler veya runbook’lar içerisinde mümkün olduğu kadar “invoke-command” kullanıyorum. Bu fonksiyon sayesinde uzak bir sunucuda tek bir komut veya birden fazla komutu çalıştırabilir ve çıktılarını daha sonra kullanmak için bir değişken içerisinde tutabilirim.
Bazı arkadaşlarım bana neden “Enter-Pssession” kullanmadığımı soruyor. Öncelikle Enter-PSSession kalıcı bir ihtiyaç duyuyorsanız ideal bir çözümdür. Bir kere uzak sunucuya bağlandığınızda session hep açık kalır. Bu hem iyi hem de kötüdür. Uzaktaki sunucuya hiç “remote desktop” yapmadan powershell ile bağlanıp yönetmenizi ve scriptler çalıştırabilirsiniz. Bir taraftan da kötüdür. Düşünsenize bir monitoring aracınız sürekli olarak sunucularda ki servislerinizi izliyor ve bir servis durduğu zaman ip adresini powershell scriptinize yollayıp otomatik bağlanmasını ve servisi başlatmasını istiyorsanız kalıbı bir bağlantı sağlanması veya her işlemden sonra bağlantıyı sonlandırmak için ek fonksiyonları çağırmak(Remove-PSSession) külfetli geliyor.
Invoke-Command ise bağlantıyı kurup çalışıp çıkış yaptığından dolayı benim daha çok tercih ettiğim bir fonksiyondur. Peki nasıl kullanılır?Mesela uzaktaki bir sunucuya bağlanıp registery kaydına bir şey ekleyen bir script hazırlayalım.
Başka bir yazımda bahsettiğim gibi “stored credential” kullanarak yeni bir session yaratabilirsiniz.Ya da aşağıda ki komutu kullanarak bir popup içerisinde username ve şifrenizi girebilirsiniz.
$cred = Get-Credential -Credential <domain\username>
#Session yaratmak için önce credential’ları almamız gerekiyor. Stored credential veya yukarıda ki yöntemi kullanabilirsiniz.
[string]$reg1 = “Test”
$session = New-Pssession –ComputerName <remoteServer> -Credential $cred
Invoke-Command –Session $session –ScriptBlock { New-ItemProperty -Path HKLM:\SOFTWARE\Test -Name Kritiklik -PropertyType String -Value args[0] } -Args $reg1
Burada önemli olan nokta –Args ile listelediğimiz değişkenleri uzaktaki sunucuda çağırmak istersek değişkenleri verdiğimiz sırayla numaralandırmalıyız. Örnek olarak
-Args $reg1 $reg2 $reg3
ScriptBlock içerisinde şu şekilde kullanılmalıdır
$args[0] $args[1] $args[2]
Invoke-command’u runbooklarınız içerisinde de kullanabilirsiniz.