PowerShell 7 Uzaktan Temizleme Temizleme
Artık PowerShell 7 burada olduğuna ve Windows 10 masaüstünüze yüklendiğine göre, hazırsınız, değil mi? Muhtemelen hepinizin hazır olduğunu söyleyebilirim. Ancak benim gibi PowerShell 7 beta sürümünü çalıştırıyorsanız veya PowerShell Core'u da yüklediyseniz, küçük bir temizlik gerekebilir. Tartışacağım şeyin ciddi bir anlamı olduğunu düşünmüyorum. Ama ben düzenli bir sistemi sürdürmeyi seviyorum ve bahse girerim çoğunuz da öyle yapıyorsunuzdur.
Herkes İçin PSSessionYapılandırmaları
Windows 10 masaüstümde PowerShell'in 6.x sürümü olan PowerShell Core'un yanı sıra PowerShell 7 betalarını ve sürüm adaylarını çalıştırıyordum. Her biriyle WSMan üzerinden uzaktan iletişimi etkinleştirdim. Zamanla bu durum beni birden fazla PSSessionConfiguration ayarıyla baş başa bıraktı.
PowerShell 7'de PowerShell 5,1 oturumlarını görmezsiniz. Bunları burada bırakmanın herhangi bir sorun yaratacağından şüpheliyim ama bana karmaşık geliyor. Bu noktada PowerShell Core 6.x'i zaten kaldırdım, dolayısıyla ilgili oturumlara kesinlikle ihtiyacım yok. Biraz daha derine inersem bu oturumların neye işaret ettiğini keşfedebilirim.
İlk düşüncem bu dosyalardan bazılarının o zamandan beri silinmiş olduğuydu. Hangi oturumların hala geçerli eklenti dosyalarına sahip olduğunu belirlemek için PowerShell'i kullanabileceğimi düşündüm.
Bu beni şaşırttı. Ancak kolayca doğrulandı.
PowerShell v6.x sürümleri uzun süredir kaldırılmış olsa da bu konumlar kaldı. Eski PowerShell 7 bitleriyle birlikte.
Sürüm Temizleme
PowerShell 7'nin son sürümünü yüklediğinizde ve uzaktan iletişimi etkinleştirdiğinizde 7 ve 7.0.0 etiketli klasörler alacaksınız. Her klasördeki eklenti dosyaları aynıdır. Şu ana kadar öğrendiklerime göre bu tasarım gereğidir. Genel bir PowerShell 7 klasörü ve ardından sürüme özel bir klasör olan 7.0.0 vardır. Muhtemelen gelecekte bir noktada 7.0.0 klasörünün üzerine yazacak PowerShell 7.1.0 gibi bir şey yükleyeceğim. Bu konu hakkında daha fazla bilgi edinmeye çalışıyorum ancak şimdilik bu, temizlik görevlerimi etkilemiyor.
Temizleme işlemim, eski dosya ve klasörlerin kaldırılması ve eski PSSessionConfigurations'ın kaydının silinmesinden oluşacaktır.
#requires -version 7.0
[cmdletbinding(SupportsShouldProcess)]
Param()
#clean up folders
Get-Childitem -path $env:windir\system32\powershell -directory |
Where-object {$_.name -notmatch "^7(\.0\.0)?$"} | Remove-Item -Force -Recurse
#clean up sessions
Get-PSSessionConfiguration | Where-object {$_.name -notmatch "^Powershell\.7(\.0\.0)?$"} |
Unregister-PSSessionConfiguration -Force -NoServiceRestart
Write-Warning "You will need to restart the WinRM service for these changes to take effect"
Betik dosyası, geçerli PowerShell 7.0.0 dosyalarını ve oturumlarını saklamak için normal ifade modelini kullanır. Ayrıca -WhatIf desteğini de ekledim.
Her şeyin hazır olduğunu düşündüm. Ama görünüşe göre hayır.
Dosyaları kaldırmadan önce oturum yapılandırmasını kaldırmam gerektiğini düşünüyorum. Bu yüzden senaryomu revize ettim.
[cmdletbinding(SupportsShouldProcess)]
Param()
#clean up sessions
$sessions = Get-PSSessionConfiguration | Where-Object {$_.name -notmatch "^Powershell\.7(\.0\.0)?$"}
foreach ($session in $sessions) {
Try {
Unregister-PSSessionConfiguration -Name $session.name -Force -NoServiceRestart -ErrorAction Stop
}
Catch {
#Fall back to this if the cmdlet fails
winrm delete http://schemas.microsoft.com/wbem/wsman/1/config/plugin?Name=$($session.name)
}
}
#clean up folders
Get-Childitem -path $env:windir\system32\powershell -directory |
Where-object {$_.name -notmatch "^7(\.0\.0)?$"} | Remove-Item -Force -Recurse
Bu versiyonda Unregister-PSSessionConfiguration başarısız olursa winrm komut satırı aracına geri döneceğim. Ancak tekrar denediğimde yine hata alıyorum. Aslında işleri tamamen berbat etmiş gibiyim. Ama sorun değil. Bu şekilde daha fazlasını öğrenebilirim. Belki bazılarınız eşit derecede çöpe atılmış ortamlarla karşılaşabilir.
Daha Derine Kazmak
Yapmam gereken, dosyaları silmeden önce yedeklemekti. Veya bir sistem geri yükleme noktası oluşturdunuz. Bunu aklınızda tutmalısınız. Benim durumumda alternatif bir rotaya gitmem gerekecek çünkü WinRM hizmetini yeniden başlattıktan sonra bile WSMan yapılandırmam hala eklenti yapılandırmalarını arıyor. Bunlar kayıt defterinde saklanır.
Eski kayıt defteri girişlerini kaldırırsam Get-PSSessionConfiguration hatasını aşabileceğim varsayımıyla çalışıyorum.
$regPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Plugin"
#get the PowerShell plugins
$ps = Get-Childitem -path $regPath | Where {$_.PSChildName -match "^PowerShell"}
#filter the ones to remove
$remove = $ps | where-object {$_.pschildname -notmatch "^Powershell\.7(\.0\.0)?$"}
$remove | Remove-Item -Recurse -Force #-WhatIf
Doğru girişleri kaldırdığımdan emin olmak için -WhatIf ile test ettim. Bu girişler silindikten sonra nihayet istediğim PSSessionConfigurations'a sahibim.
Özet
Bu tür temizlemeyi otomatikleştirmeniz gerekmez. Ancak bunu yaparsanız, PSSessionConfiguration kaydını silmeniz ve ardından kalan tüm dosyaları veya kayıt defteri anahtarlarını silmeniz gerektiği anlaşılıyor. Şahsen ben bir gün tüm PowerShell uzaktan iletişim ihtiyaçlarım için SSH'yi kullanmayı sabırsızlıkla bekliyorum. Ancak şimdilik WSMan hala bir rol oynuyor ve ara sıra biraz ilgiye ihtiyaç duyabilir.