PowerShell ISE Uzaktan Olanakları


Normalde PowerShell ISE'yi bir betik geliştirme aracı olarak düşünürüm. Genellikle bunu günlük bir yönetim aracı olarak düşünmüyorum, çünkü öncelikle her şey aynı kapsamı paylaşıyor ve komut dosyaları çalıştırıyorsanız ve dikkatli değilseniz bazen beklenmedik sonuçlara yol açabilir. Ancak ISE'nin gerçekten sevdiğim özelliği, başka bir sunucuya uzaktan bağlantıyla yeni bir sekme açabilme yeteneğidir. Alternatif kimlik bilgilerini bile belirtebilirsiniz.

Normalde bunu Dosya - Yeni Uzak PowerShell sekmesine giderek veya Ctrl+Shift+R klavye kısayolunu kullanarak gerçekleştirebilirsiniz. Ancak, örneğin yönetmek istediğiniz anahtar sunuculara birden fazla uzak sekme açmak istiyorsanız, bu biraz sıkıcı olabilir. Veya belki de PowerShell ISE profil komut dosyanızda birden fazla uzak sekme açmak istiyorsunuz? Daha iyi bir yola ihtiyacımız var.

Neyse ki PowerShell ISE'nin komut dosyası yazılabilir bir nesne modeli var. Uzak sekme, Enter-PSSession'ı yürüten başka bir PowerShell sekmesidir. Yeni bir sekme oluşturmak oldukça basittir.


$newtab = $psise.powershelltabs.Add()

Sekme açıldığında, içinde bir komut çalıştırmak için Invoke() yöntemini kullanabilirsiniz.


$newtab.Invoke("Enter-PSSession -computername chi-dc01")

Alternatif kimlik bilgilerine ihtiyacınız varsa komutu ayarlayın. Sekmenin görünen adını bile değiştirebilirsiniz.


$newtab.DisplayName = "CHI-DC01"

Ancak dikkat edilmesi gereken birkaç şey var. Öncelikle yeni bir sekme açmak zaman alır ve komutları çağırmaya hazır olmasını beklemeniz gerekir. Kısa bir Do döngüsü kullanmanız gerekebilir.


Do {
  Start-Sleep -Milliseconds 10
} until ($newTab.CanInvoke)

Ve her yeni PowerShell sekmesi açtığınızda, yeni bir PowerShell oturumu açıyorsunuz, bu da profil komut dosyalarınızın da çalıştığı anlamına geliyor. Eğer benim gibiyseniz, uzak sekme profilimdeki hiçbir şeyi kullanmayacağından bu tamamen gereksiz olan biraz ek yük ekler. Bu yüzden herhangi bir profili çalıştırmadan sekmeyi açmanın bir yoluna ihtiyacım var. Çok şükür bu yapılabilir ama İMKB'de açığa çıkan bir şey değil. Ancak PowerShell MVP'si arkadaşım Tobias Weltner sayesinde artık ISE'nin iç kısımlarını inceleyen ve profil yükleme seçeneğini kapatan bazı kodlara sahibim.


$type = ([Microsoft.Windows.PowerShell.Gui.Internal.MainWindow].Assembly.GetTypes()).Where({ $_.Name -eq 'PSGInternalHost' })
$currentField = $type.GetField('current', 'NonPublic,Static')
$noprofileField = $type.GetField('noProfile', 'NonPublic,Instance')
$pshost = $currentField.GetValue($type)
$noprofileField.SetValue($pshost,$True)

Yeniden etkinleştirmek için son satırı çalıştırıp değeri $False olarak ayarlayabilirim.

Ve tabii ki PowerShell ISE için New-ISERemoteTab adında bir işlev oluşturarak bunu kullanımınızı kolaylaştırmaya çalıştım. Kaynak kodunu GitHub'da bulabilirsiniz.

İşlevim, yeni bir uzak sekme oluşturmanın yanı sıra, uzak bağlantı kurulduktan sonra da birkaç komut çalıştırıyor. Temiz bir sayfa açmayı tercih ediyorum bu yüzden en azından Clear-Host'u çalıştırmayı seviyorum. Uzak sekmedeki komutları, oluşturduğunuz yeni sekme nesnesinden çağırabilirsiniz.


"Set-Location -path 'C:\'","Clear-Host","WhoAmI",'$PSVersionTable' | foreach {
   Write-Verbose "[$($newTab.Displayname)] Invoking $_"
   $newTab.Invoke($_)
   #wait for command to complete
Do {
   Start-Sleep -Milliseconds 10
} until ($newTab.CanInvoke)
} #foreach command

Vermem gereken diğer taviz, eğer bir kimlik bilgisi belirtirseniz, bunu geçici olarak diske aktarmam gerektiğidir. Yeni sekme yeni bir PowerShell oturumu olduğundan, değişkenleri diske yazmadan oturumlar arasında aktarmayı bulmamın bir yolu yok. Ancak işlemin sonunda dosya silinir.

Ve sonuç bu:

Yeni sekme komutlarını değiştirmekten çekinmeyin. Birden fazla bilgisayar ve bir kimlik bilgisi belirtirseniz tüm bağlantılar için aynı kimlik bilgisi kullanılacaktır.

Ancak aynı zamanda kimlik bilgileri isteme seçeneğim de var. Bu, diske hiçbir şey yazmaz ve birden fazla bilgisayar belirtirseniz farklı bilgisayarlar için farklı bir kimlik bilgisi girebilirsiniz. Çalışma grubu tabanlı sunuculara bağlanmanız gerekiyorsa bunun kullanışlı olabileceğini düşündüm.

Sonuç olarak artık tek bir komutla kolayca birden fazla uzak sekme oluşturabiliyorum.


New-ISERemoteTab chi-fp02,chi-web02,chi-dc04

Komut yardımında birkaç örnek daha var.

Nasıl çalıştığını anlayabilmeniz için işleve açıklama eklemeye çalıştım, ancak GitHub'a soru veya sorun göndermekten çekinmeyin. Bunu yararlı bulursanız yorumlarınızda sizden de haber almak isterim.

Eğlence!

GÜNCELLEME: GitHub'un faydasını görmeye başlıyorum. Orijinali bugün erken saatlerde yayınladığımdan beri, birisi onu zaten geliştirdi ve ben de bu değişiklikleri projeye dahil ettim.

İlgili makaleler