Tìm kiếm trang web

Dọn dẹp từ xa PowerShell 7


Bây giờ PowerShell 7 đã có mặt và hy vọng được cài đặt trên máy tính để bàn Windows 10 của bạn, bạn đã sẵn sàng rồi phải không? Tôi muốn nói rằng có lẽ bạn đã sẵn sàng. Tuy nhiên, nếu giống như tôi, bạn đang chạy PowerShell 7 beta hoặc đã cài đặt PowerShell Core thì có thể cần phải thực hiện một chút công việc dọn dẹp. Tôi không nghĩ điều tôi sắp thảo luận có bất kỳ hàm ý nghiêm trọng nào. Nhưng tôi muốn duy trì một hệ thống gọn gàng và tôi cá là nhiều bạn cũng vậy.

Cấu hình PSSession cho mọi người

Trên máy tính để bàn Windows 10 của tôi, tôi đã chạy PowerShell Core, phiên bản 6.x của PowerShell, cũng như các phiên bản thử nghiệm và bản phát hành thử nghiệm của PowerShell 7. Tôi đã kích hoạt tính năng điều khiển từ xa qua WSMan với từng ứng dụng. Theo thời gian, điều này đã khiến tôi có nhiều cài đặt PSSessionConfiguration.

Trong PowerShell 7, bạn không thấy phiên PowerShell 5.1. Tôi nghi ngờ sẽ có bất kỳ vấn đề nào nếu chỉ để những thứ này ở đây, nhưng tôi cảm thấy nó rất lộn xộn. Tại thời điểm này, tôi đã gỡ cài đặt PowerShell Core 6.x nên chắc chắn không cần các phiên liên quan. Tìm hiểu sâu hơn một chút, tôi có thể khám phá những phiên này đang hướng đến điều gì.

Suy nghĩ đầu tiên của tôi là một số tệp này đã bị xóa. Tôi nghĩ rằng tôi có thể sử dụng PowerShell để xác định phiên nào vẫn có tệp plugin hợp lệ.

Điều này làm tôi ngạc nhiên. Nhưng nó đã được xác minh dễ dàng.

Mặc dù phiên bản PowerShell v6.x đã được gỡ cài đặt từ lâu nhưng những vị trí này vẫn còn. Cùng với PowerShell 7 bit cũ hơn.

Dọn dẹp phiên bản

Khi cài đặt bản phát hành cuối cùng của PowerShell 7 và bật tính năng điều khiển từ xa, bạn sẽ nhận được các thư mục có nhãn 7 và 7.0.0. Các tập tin plugin trong mỗi thư mục đều giống hệt nhau. Từ những gì tôi đã học được cho đến nay, đây là do thiết kế. Có một thư mục PowerShell 7 chung và sau đó là thư mục dành riêng cho phiên bản, 7.0.0. Có lẽ, tại một thời điểm nào đó trong tương lai, tôi sẽ cài đặt thứ gì đó như PowerShell 7.1.0 để ghi đè lên thư mục 7.0.0. Tôi đang cố gắng tìm hiểu thêm về vấn đề này, nhưng hiện tại điều đó không ảnh hưởng đến nhiệm vụ dọn dẹp của tôi.

Việc dọn dẹp của tôi sẽ bao gồm việc xóa các tệp và thư mục lỗi thời cũng như hủy đăng ký PSSessionConfigurations lỗi thời.

#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"

Tệp tập lệnh sử dụng mẫu biểu thức chính quy để giữ các tệp và phiên PowerShell 7.0.0 hiện tại. Tôi cũng bao gồm hỗ trợ cho -WhatIf.

Tôi nghĩ rằng tôi đã sẵn sàng. Nhưng hình như là không.

Tôi nghi ngờ rằng lẽ ra tôi nên xóa cấu hình phiên trước khi xóa các tệp. Vì vậy tôi đã sửa lại kịch bản của mình.

[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

Trong phiên bản này, nếu Unregister-PSSessionConfiguration không thành công, tôi sẽ quay lại công cụ dòng lệnh winrm. Tuy nhiên, khi tôi thử lại, tôi vẫn gặp lỗi. Trên thực tế, có vẻ như tôi đã hoàn toàn làm hỏng mọi việc. Nhưng không sao đâu. Đó là cách tôi có thể học hỏi thêm. Có lẽ một số bạn có thể gặp phải môi trường rác rưởi như nhau.

Đào sâu hơn

Những gì tôi nên làm là sao lưu các tập tin trước khi xóa chúng. Hoặc tạo điểm khôi phục hệ thống. Bạn nên ghi nhớ điều đó. Trong trường hợp của tôi, tôi sẽ cần phải đi một con đường thay thế vì ngay cả sau khi khởi động lại dịch vụ WinRM, cấu hình WSMan của tôi vẫn đang tìm kiếm cấu hình plugin. Chúng được lưu trữ trong sổ đăng ký.

Tôi đang giả định rằng nếu tôi xóa các mục đăng ký lỗi thời, tôi có thể khắc phục được lỗi Get-PSSessionConfiguration.

$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

Tôi đã thử nghiệm với -WhatIf để xác minh rằng tôi đang xóa các mục nhập chính xác. Khi các mục đó bị xóa, cuối cùng tôi cũng có PSSessionConfigurations mà tôi muốn.

Bản tóm tắt

Bạn không cần phải tự động hóa kiểu dọn dẹp này. Nhưng nếu làm vậy, có vẻ như bạn nên hủy đăng ký PSSessionConfiguration rồi xóa mọi tệp hoặc khóa đăng ký còn sót lại. Cá nhân tôi mong đợi một ngày nào đó có thể sử dụng SSH cho tất cả các nhu cầu điều khiển từ xa PowerShell của mình. Nhưng hiện tại, WSMan vẫn đóng một vai trò nào đó và thỉnh thoảng có thể cần được chú ý một chút.

Bài viết liên quan