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

Check Computer Object is Alive On Domain

Powershell'in gücü system admin rolündeki kişiler için tartışılmaz. Zaman zaman üzerinde aging tanımı olmayan ortamlarda, düzgün yönetilemeyen domain ve dns ortamlarında aslında kapalı olan ve kapalı olmamasına rağmen domainden düşmüş computer objelerinin tespit edilebilmesi için aşağıdaki gibi bir script geliştirmiştim. Umarım faydası olur, her türlü ek geliştirme için hakkiogretmen@gmail.com adresine mail atabilirsiniz. Import-Module ActiveDirectory $myServers = @("servers") If (Test-Path "D:\Temp\PasswordLastSetResult.txt"){ Remove-Item "D:\Temp\PasswordLastSetResult.txt" } $Servers_OU =  "OU=ServersOU,OU=ABCServersOU,DC=mydomain,DC=dmn,DC=com" foreach ($myserver in $myServers)         {         $mycomp = Get-ADComputer –SearchBase $Servers_OU –SearchScope SubTree -Filter { OperatingSystem -like "Windows Server*"} -Properties PasswordLastSet,IPv4Address | Select * | Where-Object {$_.Name -eq $myserver} trap [Syste...

Powershell Kullanarak Windows Features Yönetimi (Import And Export)

Bu yazı Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows Server 2012 R2 ve Windows Server 2016 işletim sistemleri üzerinde kullanılabilecek bilgiler içerir. Yazıyı okumaya başlamadan önce yazı içerisinde kullanılacak Get-WindowsFeature ve Add-WindowsFeature cmdletleriyle ilgili detaylı bilgileri inceleyebilirsiniz. Kendi ortamınızda test yapmadan önce ServerManager modülünü import etmelisiniz, Import-Module cmdlet için de yine MSDN üzerindeki bilgilerden faydalanabilirsiniz. Umarım faydalı bir yazı olmuştur. Birden fazla sunucuya benzer kurulumları yapmak istediğimizde karşımıza operasyonel zorluklar çıkabiliyor. Bu işlemleri hızlandırmanın & standart bir hale getirmenin bir çok yolu var ancak bu yazıda bir sunucu üzerinde kurulu Windows Feature'ların powershell ile toplanarak, diğer bir sunucuda kurulması için en basit olduğunu düşündüğüm yöntemi paylaşacağım. İlk olarak servermanager modülünün Powershell sessionımıza import edilmesi gerekmekted...

Windows Feature Batch Deployment

Aşağıdaki function ile bir sunucu üzerinde oluışturduğumuz configuration file dosyası ile uzak lokasyondaki birden çok sunucuya yükleme yapabiliriz. Umarım faydalı olur, her türlü ek geliştirme için hakki.ogretmen@gmail.com adresine mail atabilirsiniz. function Invoke-WindowsFeatureBatchDeployment { param ( [parameter(mandatory)] [string[]] $ComputerNames, [parameter(mandatory)] [string] $ConfigurationFilePath ) # Deploy the features on multiple computers simultaneously. $jobs = @() foreach($ComputerName in $ComputerNames) { $jobs += Start-Job -Command { Install-WindowsFeature -ConfigurationFilePath $using:ConfigurationFilePath -ComputerName $using:ComputerName -Restart } } Receive-Job -Job $jobs -Wait | Select-Object Success, RestartNeeded, ExitCode, FeatureResult }