Ana içeriğe atla

Powershell Remote Yönetimi

Powershell'in ne kadar güçlü bir tool oluğunu hepimiz biliyoruz. En güçlü ve güvenlik anlamında korkutucu özelliklerinden birisi ise local administrator yetkilerine sahip olduğumu bir credential ile WinRM kullanarak istediğimiz scriptleri çalıştırabilmek diyebiliriz.

Akşam televizyon başında oyalanırken 3 aşamadan oluşan bir script yazarak remote sessionda script çalıştırmayı deneme fırsatım oldu. Bu test sırasında ilk olarak iki ayrı çok basit functiondan ve write-host ile host ekranına yazı basan bir script geliştirdim.

Bu script çalıştırken iki parametre alıyor. Kendi içerisinde iki functiondan ilkini çağırarak function çağrısının tamamlanmasını bekliyor. Çağırdığı testFunc function'ı ise yine bu script dosyası içerisindeli testFunc2 function'ı çağırıyor.

[cmdletBinding(SupportsShouldProcess)]
param(
[string]$firstParam,
[string]$secondParam
)

function testFunc2{
[cmdletBinding(SupportsShouldProcess)]
param(
[string]$newName,
[string]$oldName
)

Write-Host "ikinci functiondaki birinci parametre : $oldName "

Write-Host "ikinci functiondaki ikinci parametre : $newName "

}

function testFunc{
[cmdletBinding(SupportsShouldProcess)]
param(
[string]$oldName,
[string]$newName
)

Write-Host "birinci functiondaki birinci parametre : $oldName "
testFunc2 -newName $oldName -oldName $newName
Write-Host " birinci functiondaki ikinci parametre : $newName "

}
Write-Host "Birinci functiondan öncesi"
testFunc -oldName $firstParam -newName $secondParam
Write-Host "Function çağrısından sonrası"

Test sırasında geliştirdiğim ikinci script ise aslında bir önceki script dosyasını remote sunucuda çalıştıracak  bir script diyebilirim. Yine basit bir iş yapan script.

Bu script de çalışırken üç parametre alıyor. Bu parametreler aslında bir önceki scripte göndereceği parametrelere ek olarak scriptin çalıştırılacağı destination host ismidir.

Ek olarak  bu script içerisinde session oluşturma mantığını görüyoruz. Buradaki session kullanma yapısı öncelikle belirtilen computer name için mevcut bir session olup olmadığını kontrol ediyor. Eğer session yok ise yeni session oluşturuluyor, session var ise mevcut session kullanılıyor.

Invoke-Command ile gördüğümüz satırda daha önce yazılıp diske kaydedilmiş script parametreleriyle çalıştırıyoruz.

[cmdletBinding(SupportsShouldProcess)]
param(
[string]$firstParamx,
[string]$secondParamx,
[ValidateNotNullOrEmpty
[string]$ComputerName
)
write-Host "İkinci script içerisindeyim"

$myPsSession = Get-PSSession | where { $_.ComputerName -eq $ComputerName -and $_.State -eq 'Opened' }
if (-not $myPsSession) {
    try { $myPsSession = New-PSSession -ComputerName $ComputerName -EA 1 } catch { throw }
}



Invoke-Command -FilePath "C:\scripts\testFuncForRemoteExec.ps1" -Session $myPsSession -ArgumentList $firstParamx,$secondParamx


Get-PSSession 


Son olarak bu yazdığımız scripti çalıştıracağımız aslında scriptlerin ilk trigger edildiği noktada çalışacak üçüncü script aşağıdaki gibidir. Bu scriptle de aslında diske kaydettiğimiz bir önceki script parametrelerle birlikte çalıştırılıyor.

C:\scripts\testFuncForRemoteExecFirst.ps1 -firstParamx "oldName" -secondParamx "newName" 

Kendi ortamınızda deneyebilir, sorularınızı ve önerilerinizi paylaşabilirsiniz. Umarım faydalı olur.

Herkese iyi haftalar dilerim.

Yorumlar

Bu blogdaki popüler yayınlar

gMSA (group managed service account) and SQL Server

MSA (managed user account) teknolojisinin sorunlarından bir tanesi aynı MSA'i birden fazla computer objesinde kullanamamaktı. Bu nedenle de gMSA (group managed service account) duyuruldu. gMSA ile; Passwordler Active Directory tarafından yönetileceği için complex olurlar ve sık sık otomatik olarak değiştirilir (default 30 days). Passwordler 240 bytes uzunluğunda randomly şifrelenmiş olarak üretilir. Ek olarak interactive logon amaçlı kullanılamazlar, yanlış şifre girilmesi sonucunda meydana gelen lock-out olma durumuna yakalnmazlar. Şifre değişikliği sonrasında SQL Server Servisinin restart edilmesine gerek bulunmaz. Aşağıda belirtilen adımlar pre-reqlerin tamamlanmış olduğu varsayılarak step by step aktarılmıştır. Prerequisetlerle ilgili detaylı bilgilendirmeye  https://technet.microsoft.com/en-us/library/jj128431.aspx#BKMK_gMSA_Req  linkinden erişilebilir. 1-  Active Directory Users and Computers Altında Global Security Group Oluşturma gMSA 'i kullanacağımız sun

Import Active Directory Module in Powershell

Active Directory rolüne sahip olmayan bir workstation üzerinde AD yönetimi için powershell script çalıştırmak istiyorsanız öncelikle Remote Server Administration Tools feature’ini workstation üzerinde kurmalısınız. Kurulumu tamamlandıktan sonra aşağıdaki komut ile öncelikle modüller arasında ActiveDirectory modülünün olup olmadığı kontrol edilir, eğer modüller arasında ActiveDirectory modülü yoksa session bazında Import-Module cmd’letiyle Active Directory commandletleri kullanımımıza açılır. if ( -not ( Get-Module -Name ActiveDirectory -ea Continue )) { Import-Module ActiveDirectory -ea Stop } Umarım faydalı olur.  

Fun With Docker..ELK Stack- ElasticSearch

Herkese Merhaba, Fun with Docker yazı serisine ELK Stack kurulumunu aktaracak, yazı dizisi içerisinde yeni bir yazı dizisiyle devam etmeye karar verdim. Bilmeyenler için ELK, 3 ayrı open source proje olan Elasticsearch, Logstash ve Kibana projelerinin birleşiminden oluşan yine open source olarak kullanıma sunulan ve bakımı Elastic tarafından  yürütülen bir proje. Bu arada ELK Stack ile ilgili tüm detaylara  https://www.elastic.co/elk-stack  linkini kullanarak ulaşabilirsiniz.  Peki biz yazı dizisi sırasında ELK Stack ile neler yapmaya çalışacağız? Docker hostumuz (Windows 10) üzerinde File Beat kurarak, IIS Loglarını toparlayacağız. Topladığımız bu IIS loglarını container üzerinde koşan LogStash'e gönderecek ve LogStash üzerinde yaptığımız konfigürasyonlarla parse operasyonunu tamamlayıp, oluşan anlamlı datayı yine container üzeride koşan ElasticSearch 'e insert edeceğiz.  Insert ettiğimiz tüm bu log datasını ise yine container imajı olarak ayağa kaldırıp