Quản lý VPS Windows bằng PowerShell remoting

SSH vào VPS Linux thì quen, nhưng với VPS Windows, mở Remote Desktop mỗi lần kiểm tra service hay đọc log là chậm và nặng. PowerShell remoting (WinRM) cho phép bạn mở một phiên PowerShell từ máy local trỏ thẳng tới VPS Windows Server, chạy lệnh như đang ngồi trên console, không cần màn hình desktop. Bài này hướng dẫn từ bật tính năng, cấu hình firewall, kết nối, đến xử lý lỗi thường gặp trên Windows Server 2022 và 2025.
Tóm tắt nhanh:
- WinRM là giao thức mặc định của PowerShell remoting, hoạt động trên port 5985 (HTTP) và 5986 (HTTPS).
- Cần chạy
Enable-PSRemotingtrên VPS để bật listener và rule firewall. - Client phải thêm IP VPS vào
TrustedHosts(trong workgroup) trước khi kết nối. - Dùng
Enter-PSSessionđể mở phiên tương tác,Invoke-Commandđể chạy lệnh một lần.
Yêu cầu trước khi bắt đầu
- Một VPS Windows bản Server 2022 hoặc Server 2025, đã cài sẵn, có quyền Administrator.
- Máy local dùng Windows 10/11 Pro hoặc Windows Server, đã cài PowerShell 5.1+ (bản đi kèm Windows) hoặc PowerShell 7.x.
- Biết địa chỉ IP của VPS. Nếu dùng VPS Linux làm client thì cần cài thêm PowerShell 7 cho Linux và dùng
pwsh, nhưng tựa bài này tập trung client Windows. - Mở port 5985 trên firewall Windows của VPS. Kiểm tra gói dịch vụ VPS Windows có cấu hình RDP sẵn, nhưng WinRM phải tự bật.
Vì sao nên dùng PowerShell remoting thay vì RDP
RDP vẫn cần thiết cho việc cài phần mềm có giao diện, nhưng đa số tác vụ quản trị hàng ngày là dòng lệnh: kiểm tra service, đọc event log, đổi cấu hình IIS, restart dịch vụ. Làm từng việc này qua RDP nghĩa là mở desktop, ngồi chờ, rồi gõ từng lệnh. PowerShell remoting cho phép bạn chạy một script chạy trên nhiều VPS cùng lúc, thu kết quả về dạng object để xử lý tiếp. Cách làm này gần với cách bạn SSH vào máy Linux: nhanh, nhẹ, tự động hóa được.
Với các VPS chạy Windows Server, WinRM là giao thức chuẩn mà Microsoft xây dựng cho việc quản trị từ xa. Khi bạn cần chạy lệnh hàng loạt trên 10 VPS, hay kết hợp với Ansible, thì WinRM là cửa ngõ bắt buộc. Bỏ thói quen mở RDP cho mọi việc, bạn sẽ thấy tốc độ xử lý nhanh hơn nhiều.
Bước 1 - Bật WinRM trên VPS Windows
Đầu tiên, đăng nhập VPS qua RDP một lần để mở PowerShell với quyền Administrator. Chạy lệnh sau:
Enable-PSRemoting -Force
Lệnh này khởi động service WinRM, đặt nó ở chế độ tự khởi động, tạo listener HTTP trên port 5985, và thêm rule firewall cho phép kết nối từ các máy trong cùng subnet. Với VPS ở data center, máy local của bạn không cùng subnet nên cần thêm tham số -SkipNetworkProfileCheck để rule firewall áp dụng cho cả hồ sơ mạng Public:
Enable-PSRemoting -Force -SkipNetworkProfileCheck
Kiểm tra service đang chạy:
Get-Service WinRM
Kết quả mong đợi là Status: Running. Xem listener đang lắng nghe trên port nào:
winrm enumerate winrm/config/listener
Bạn sẽ thấy một mục với Transport = HTTP và Port = 5985. Nếu chưa có, tạo listener thủ công:
winrm quickconfig -q
Bước 2 - Cấu hình TrustedHosts trên máy local
VPS Windows của bạn nằm trong workgroup (không thuộc domain Active Directory). Trong trường hợp này, máy local phải khai báo danh sách các host đáng tin cậy trước khi kết nối, nếu không bạn gặp lỗi Access is denied hoặc WinRM client cannot process the request.
Trên máy local, mở PowerShell với quyền Administrator, thêm IP của VPS vào TrustedHosts:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "203.113.150.20" -Concatenate
Thay 203.113.150.20 bằng IP thật của VPS. Tham số -Concatenate giữ nguyên danh sách cũ nếu có. Nếu muốn thêm nhiều IP, phân tách bằng dấu phẩy:
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "203.113.150.20,203.113.150.21" -Concatenate
Kiểm tra danh sách hiện tại:
Get-Item WSMan:\localhost\Client\TrustedHosts
Lưu ý: trong môi trường domain có thể dùng Kerberos thay cho TrustedHosts vì an toàn hơn (không gửi mật khẩu qua HTTP). Với workgroup VPS, TrustedHosts là cách thực tế riêng biệt trừ khi bạn cấu hình HTTPS với chứng chỉ. Nếu chỉ dùng trong mạng nội bộ lab, một số người đặt giá trị * cho tất cả các host, nhưng mình khuyên không nên vì bảo mật kém.
Bước 3 - Kết nối lần đầu bằng Enter-PSSession
Bây giờ từ máy local, mở phiên tương tác tới VPS:
Enter-PSSession -ComputerName 203.113.150.20 -Credential (Get-Credential)
Một cửa sổ nhập mật khẩu hiện ra, bạn điền tài khoản Administrator và mật khẩu của VPS. Lưu ý tài khoản có thể là Administrator hoặc tên user bạn đặt. Nếu VPS dùng tài khoản Microsoft thì dùng định dạng MicrosoftAccount\[email protected].
Sau khi xác thực thành công, prompt của PowerShell đổi thành dạng:
[203.113.150.20]: PS C:\Users\Administrator\Documents>Phần [203.113.150.20]: cho biết bạn đang ở trong phiên từ xa. Giờ mọi lệnh gõ vào đều chạy trên VPS. Thử kiểm tra hostname và phiên bản Windows:
hostname
[System.Environment]::OSVersion.VersionString
Thoát phiên bằng:
Exit-PSSession
Bạn quay về prompt máy local.
Bước 4 - Chạy lệnh một lần bằng Invoke-Command
Không phải lúc nào cũng cần phiên tương tác. Khi chỉ muốn chạy một lệnh hoặc một script rồi lấy kết quả, dùng Invoke-Command sẽ gọn hơn vì không cần giữ phiên mở.
Invoke-Command -ComputerName 203.113.150.20 -Credential (Get-Credential) -ScriptBlock { Get-Service -Name W3SVC, MSSQLSERVER }
Lệnh này kiểm tra trạng thái của IIS (W3SVC) và SQL Server, trả kết quả về máy local dưới dạng object, có thể đẩy qua pipeline xử lý tiếp. Nếu cần chạy một script file nằm trên máy local, dùng tham số -FilePath:
Invoke-Command -ComputerName 203.113.150.20 -Credential (Get-Credential) -FilePath C:\scripts\check-health.ps1
Kết quả trả về máy local nhưng script thực thi trên VPS. Cách này rất hữu ích khi bạn cần chạy cùng một script trên nhiều VPS, chỉ cần liệt kê tên trong mảng:
$servers = "203.113.150.20","203.113.150.21"
Invoke-Command -ComputerName $servers -Credential (Get-Credential) -ScriptBlock { Get-Process -Name w3wp -ErrorAction SilentlyContinue | Select-Object Id, CPU, WorkingSet64 }
Muốn kết quả hiển thị trực tiếp trên console từng máy thay vì gom về một chỗ, thêm -InDisconnectedSession hoặc xử lý bằng ForEach-Object. Cách gom về một chỗ mình thấy dễ đọc hơn.
Bước 5 - Cấu hình WinRM qua HTTPS cho môi trường production
Giao thức HTTP trên port 5985 không mã hóa. Trong mạng nội bộ tin cậy thì chấp nhận được, nhưng khi điều khiển VPS qua Internet thì nên mã hóa. Có hai lựa chọn: dùng SSL (HTTPS 5986) hoặc bật tính năng CredSSP/Negotiate. Cách phổ biến là cấu hình listener HTTPS với chứng chỉ tự ký hoặc chứng chỉ từ CA nội bộ.
Tạo chứng chỉ tự ký trên VPS (thao tác này chạy trên VPS, qua RDP hoặc một phiên trước đó):
$cert = New-SelfSignedCertificate -DnsName "vps01.example.com" -CertStoreLocation Cert:\LocalMachine\My
Sau đó tạo listener HTTPS mới, trỏ tới thumbprint của chứng chỉ:
New-Item -Path WSMan:\Localhost\Listener -Transport HTTPS -Address * -CertificateThumbPrint $cert.Thumbprint -Force
Mở port 5986 trên firewall:
New-NetFirewallRule -DisplayName "WinRM HTTPS" -Direction Inbound -Protocol TCP -LocalPort 5986 -Action Allow
Từ máy local, kết nối bằng HTTPS, đồng thời bỏ qua kiểm tra CA nếu dùng chứng chỉ tự ký:
$opt = New-PSSessionOption -SkipCACheck -SkipCNCheck
Enter-PSSession -ComputerName 203.113.150.20 -Credential (Get-Credential) -UseSSL -SessionOption $opt
Lưu ý: trong môi trường workgroup không có Kerberos, xác thực mặc định qua Negotiate sẽ gửi mật khẩu dạng băm NTLM. Việc bật HTTPS giúp chống nghe lén trên đường truyền, nhưng vẫn nên đặt mật khẩu Administrator mạnh. Đây là lý do mình khuyên bạn dùng HTTPS khi điều khiển VPS từ xa qua Internet, còn trong mạng nội bộ lab thì HTTP+TrustedHosts là đủ nhanh.
Xử lý lỗi thường gặp
Lỗi "Access is denied" khi kết nối
Kiểm tra TrustedHosts trên máy local đã có IP VPS chưa. Đây là lỗi phổ biến nhất. Chạy lại Set-Item WSMan:\localhost\Client\TrustedHosts và chắc chắn bạn đang ở quyền Administrator. Đồng thời xác nhận tài khoản đăng nhập có quyền trên VPS, không dùng tài khoản LocalSystem hay Network Service.
Lỗi "The client cannot connect to the destination specified"
Port 5985 chưa được mở trên firewall VPS, hoặc service WinRM chưa chạy. Kiểm tra từ máy local bằng lệnh:
Test-NetConnection 203.113.150.20 -Port 5985
Nếu kết quả TcpTestSucceeded: False, đăng nhập VPS qua RDP, chạy Enable-PSRemoting -SkipNetworkProfileCheck -Force và kiểm tra service. Một số VPS có sẵn firewall của hạ tầng (ở tầng hypervisor) chặn port riêng, cần mở thêm trên control panel của nhà cung cấp. Nếu bạn dùng VPS Windows tại thueVPS, có thể yêu cầu hỗ trợ kiểm tra port qua ticket.
Lỗi "The WinRM client cannot process the request" kèm mã 0x8033810F
Thường do chính sách AllowUnencrypted của service bị tắt. Kiểm tra cấu hình:
Get-Item WSMan:\localhost\Service\AllowUnencrypted
Nếu muốn bật (không khuyến khích), chạy:
Set-Item WSMan:\localhost\Service\AllowUnencrypted -Value $true
Nhưng thay vì tắt mã hóa, hãy cấu hình HTTPS như bước 5. Với VPS chạy Windows Server 2022 trở lên, mặc định chính sách này là $false và Microsoft khuyến nghị giữ nguyên. Một số trường hợp cần bật tạm cho lab thì dùng, còn production thì không.
Câu hỏi thường gặp
PowerShell remoting có hoạt động trên Windows Server 2025 không?
Có. WinRM và PowerShell remoting được hỗ trợ đầy đủ trên Windows Server 2022 và 2025. Các lệnh Enable-PSRemoting, Enter-PSSession, Invoke-Command hoạt động giống nhau trên cả hai phiên bản.
Port nào cần mở để dùng PowerShell remoting?
Port 5985 cho HTTP và 5986 cho HTTPS. Nếu chỉ dùng trong mạng nội bộ, mở 5985 là đủ. Từ Internet, nên dùng 5986 để mã hóa đường truyền.
Có cần mở Remote Desktop khi dùng PowerShell remoting không?
Không bắt buộc. Bạn có thể quản trị VPS hoàn toàn bằng dòng lệnh qua WinRM. Tuy nhiên, nếu cần cài phần mềm có giao diện đồ họa hoặc xem màn hình trực tiếp, vẫn cần RDP. VPS Windows của thueVPS có sẵn RDP, bạn dùng WinRM cho tác vụ hàng ngày và chỉ mở RDP khi thật sự cần.
Làm sao để tự động hóa với PowerShell remoting?
Dùng Invoke-Command với script file, hoặc kết hợp Ansible (qua module winrm) để quản lý nhiều VPS cùng lúc. Lưu mật khẩu an toàn bằng Export-Clixml hoặc dùng Credential Manager thay vì nhập mỗi lần.
TrustedHosts có an toàn không?
TrustedHosts chỉ giới hạn máy nào được phép kết nối, không mã hóa mật khẩu. Kết hợp với HTTPS để bảo mật tốt hơn. Trong môi trường domain, Kerberos là lựa chọn an toàn hơn và không cần TrustedHosts.
Bài viết liên quan
- Cấu hình Remote Desktop an toàn cho VPS Windows
- Cài đặt Windows Server 2022 trên VPS từ A đến Z
- Hướng dẫn thuê VPS Windows và cấu hình RDP an toàn 2026
- Cài đặt IIS và host website trên Windows Server


