Tổng hợp lệnh PowerShell thiết yếu cho quản trị hệ thống Windows
PowerShell là công cụ dòng lệnh và ngôn ngữ kịch bản mạnh mẽ được Microsoft phát triển, giúp các quản trị viên hệ thống (System Admin) tự động hóa và quản lý hệ thống Windows hiệu quả hơn. Thay vì thao tác thủ công qua giao diện đồ họa, PowerShell cho phép bạn thực hiện hàng loạt tác vụ phức tạp chỉ với vài dòng lệnh. Bài viết dưới đây tổng hợp những lệnh PowerShell quan trọng nhất đã được thực hiện trong thực tế quản trị hệ thống.
![]() |
Tại sao System Admin cần PowerShell?
PowerShell không chỉ là một công cụ dòng lệnh đơn thuần mà còn là nền tảng tự động hóa toàn diện cho hệ sinh thái Windows. Các lợi ích chính bao gồm:
- Tiết kiệm thời gian: Một lệnh PowerShell có thể thay thế hàng chục thao tác click chuột.
- Tự động hóa quy trình: Viết script một lần, tái sử dụng vô số lần cho các tác vụ lặp đi lặp lại.
- Quản lý từ xa: Điều khiển nhiều máy chủ đồng thời mà không cần truy cập vật lý
- Xử lý sự cố nhanh chóng: Truy xuất log, kiểm tra dịch vụ và xác định nguyên nhân lỗi nhanh chóng.
- Tích hợp sâu với Windows: Truy cập trực tiếp vào các API và thành phần hệ thống cấp thấp.
Tổng hợp một số lệnh PowerShell thường dùng trên Windows
1. Kiểm tra thông tin hệ thống
Lệnh Get-ComputerInfo
| powershell Get-ComputerInfo |
![]() |
Mục đích: Lệnh này truy xuất và hiển thị toàn bộ thông tin chi tiết về cấu hình phần cứng và phần mềm của máy tính.
Thông tin được hiển thị:
- Tên máy tính và domain
- Phiên bản hệ điều hành Windows (OS Build, Version)
- Thông tin BIOS/UEFI (nhà sản xuất, phiên bản firmware)
- Thông số CPU (tên, số nhân, tốc độ xung nhịp)
- Dung lượng RAM vật lý và khả dụng
- Thông tin múi giờ và ngôn ngữ hệ thống
Ứng dụng thực tế:
- Kiểm tra nhanh cấu hình máy trước khi cài đặt phần mềm
- Lập danh sách kiểm kê tài sản CNTT
- Xác minh phiên bản OS để đảm bảo tương thích với bản vá bảo mật
Lưu ý: Lệnh này có sẵn từ Windows 10/Server 2016 trở lên. Trên các hệ thống cũ hơn, sử dụng systeminfo trong Command Prompt hoặc kết hợp nhiều cmdlet PowerShell khác.
2. Quản lý dịch vụ Windows
Các lệnh quản lý dịch vụ cơ bản
| powershell Get-Service # Liệt kê tất cả dịch vụ và trạng thái Start-Service -Name "tên_dịch_vụ" # Khởi động một dịch vụ Stop-Service -Name "tên_dịch_vụ" # Dừng một dịch vụ Restart-Service -Name "tên_dịch_vụ" # Khởi động lại dịch vụ |
![]() |
Mục đích: Quản lý các dịch vụ Windows (Windows Services) - những tiến trình chạy ngầm thực hiện các chức năng hệ thống quan trọng.
Khi nào cần sử dụng:
- Dịch vụ bị treo hoặc không phản hồi
- Sau khi cập nhật phần mềm cần khởi động lại dịch vụ
- Kiểm tra trạng thái dịch vụ để xác định nguyên nhân lỗi
- Tắt các dịch vụ không cần thiết để tối ưu hiệu suất
Ví dụ thực tế:
| powershell Restart-Service -Name "wuauserv" # Khởi động lại dịch vụ Windows Update Get-Service -Name "Spooler" # Kiểm tra trạng thái dịch vụ Print Spooler Stop-Service -Name "tên_dịch_vụ" -Force # Dừng dịch vụ đang gặp vấn đề |
Lưu ý quan trọng:
- Cần chạy PowerShell với quyền Administrator để quản lý dịch vụ
- Một số dịch vụ hệ thống quan trọng không thể dừng hoặc có thể gây mất ổn định
- Sử dụng tham số -Force để bắt buộc dừng dịch vụ có phụ thuộc
3. Truy xuất Log hệ thống để kiểm tra sự cố
Lệnh Get-EventLog (hệ thống cũ)
| powershell Get-EventLog -LogName System -Newest 50 # Lệnh Get-EventLog (hệ thống cũ) Get-WinEvent -LogName System -MaxEvents 50 # Khuyến nghị cho hệ thống mới |
![]() |
Mục đích: Truy xuất các bản ghi sự kiện (Event Logs) từ Windows Event Viewer để phân tích và chẩn đoán vấn đề.
Sự khác biệt giữa Get-EventLog và Get-WinEvent:
| Đặc điểm | Get-EventLog | Get-WinEvent |
|---|---|---|
| Hệ thống hỗ trợ | Windows cũ hơn | Windows 7/Server 2008 R2 trở lên |
| Hiệu suất | Chậm hơn với log lớn | Nhanh hơn, tối ưu hóa tốt |
| Khuyến nghị của Microsoft | Không còn phát triển | Khuyến nghị sử dụng |
Các loại log quan trọng:
- System: Sự kiện hệ thống, driver, dịch vụ Windows
- Application: Sự kiện từ ứng dụng
- Security: Sự kiện bảo mật, đăng nhập, thay đổi quyền
Ví dụ nâng cao:
| powershell Get-WinEvent -FilterHashtable @{ LogName='System' Level=2 StartTime=(Get-Date).AddDays(-1) } # Lọc log có mức độ Error trong 24 giờ qua Get-WinEvent -FilterHashtable @{ LogName='System' ID=1074 } # Tìm sự kiện khởi động lại máy tính Get-WinEvent -LogName System -MaxEvents 1000 | # Liệt kê 1000 sự kiện mới nhất Export-Csv -Path "C:Logssystem_events.csv" -NoTypeInformation # Xuất log ra file CSV để phân tích |
Ứng dụng thực tế:
- Điều tra nguyên nhân máy chủ bị khởi động lại đột ngột
- Phát hiện lỗi driver gây Blue Screen
- Giám sát các lần đăng nhập thất bại (dấu hiệu bị tấn công)
- Tìm lỗi ứng dụng định kỳ
4. Quản lý tiến trình (Process)
Lệnh quản lý tiến trình
| powershell Get-Process # Liệt kê tất cả tiến trình đang chạy Stop-Process -Name "tên_tiến_trình" # Dừng tiến trình theo tên Stop-Process -Id 1234 # Dừng tiến trình theo ID |
![]() |
Mục đích: Giám sát và kiểm soát các tiến trình (processes) đang chạy trên hệ thống.
Thông tin được hiển thị bởi Get-Process:
- Tên tiến trình (ProcessName)
- Process ID (PID) - định danh duy nhất
- Mức sử dụng CPU (%)
- Bộ nhớ sử dụng (WorkingSet)
- Thời gian CPU tích lũy
Ví dụ nâng cao:
| powershell Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 # Tìm tiến trình tiêu tốn CPU nhiều nhất Get-Process | Sort-Object WorkingSet -Descending | Select-Object -First 10 # Tìm tiến trình sử dụng RAM nhiều nhất Get-Process -Name "chrome" | Stop-Process # Dừng tất cả tiến trình Chrome Stop-Process -Name "notepad" -Confirm # Dừng tiến trình với xác nhận Stop-Process -Name "hung_app" -Force # Dừng tiến trình bắt buộc (không lưu dữ liệu) |
Ứng dụng thực tế:
- Xử lý ứng dụng bị treo không phản hồi
- Giải phóng tài nguyên khi máy chủ quá tải
- Phát hiện phần mềm độc hại hoặc tiến trình lạ
- Giám sát hiệu năng ứng dụng trong thời gian thực
Lưu ý: Sử dụng -Force cẩn thận vì có thể mất dữ liệu chưa lưu.
5. Quản lý Tài khoản người dùng nội bộ
Lệnh quản lý tài khoản Local User
| powershell New-LocalUser -Name "TenBanChon" -Password (ConvertTo-SecureString "MatKhau123!" -AsPlainText -Force) # Tạo tài khoản người dùng mới Set-LocalUser -Name "username" -Description "Mô tả mới" # Cập nhật mô tả tài khoản Add-LocalGroupMember -Group "Administrators" -Member "username" # Thêm người dùng vào nhóm Administrators |

Mục đích: Quản lý tài khoản người dùng cục bộ trên máy tính Windows không thuộc domain Active Directory.
Các cmdlet quan trọng khác:
| powershell Get-LocalUser # Liệt kê tất cả tài khoản local Disable-LocalUser -Name "username" # Vô hiệu hóa tài khoản Enable-LocalUser -Name "username" # Kích hoạt lại tài khoản Remove-LocalUser -Name "username" # Xóa tài khoản Set-LocalUser -Name "username" -Password (Read-Host -AsSecureString) # Đổi mật khẩu Get-LocalGroupMember -Group "Administrators" # Xem thành viên của nhóm Remove-LocalGroupMember -Group "Administrators" -Member "username" # Xóa người dùng khỏi nhóm |
Ví dụ tạo tài khoản hoàn chỉnh:
| powershell $Password = Read-Host -AsSecureString -Prompt "Nhập mật khẩu" New-LocalUser -Name "ServiceAccount" ` -Password $Password ` -FullName "Service Account" ` -Description "Tài khoản dịch vụ nội bộ" ` -PasswordNeverExpires # Tạo tài khoản với mật khẩu không bao giờ hết hạn Add-LocalGroupMember -Group "Remote Desktop Users" -Member "ServiceAccount" # Thêm vào nhóm Remote Desktop Users |
Lưu ý bảo mật:
- Sử dụng Read-Host -AsSecureString để nhập mật khẩu an toàn, không hiển thị trên màn hình
- Áp dụng nguyên tắc least privilege: chỉ cấp quyền tối thiểu cần thiết
- Thường xuyên xem xét và xóa tài khoản không còn sử dụng
- Đối với môi trường doanh nghiệp, nên sử dụng Active Directory thay vì local user
Phạm vi áp dụng: Các cmdlet này chỉ hoạt động trên Windows 10/11 và Windows Server 2016 trở lên. Với hệ thống cũ hơn, sử dụng net user trong Command Prompt.
6. Theo dõi tài nguyên Hệ thống
Giám sát CPU
| powershell Get-Counter 'Processor(_Total)% Processor Time' | Select-Object -ExpandProperty CounterSamples | Select-Object CookedValue # Lệnh giám sát CPU trong PowerShell Get-Counter 'MemoryAvailable MBytes' # Lệnh giám sát Memory trong PowerShell |
![]() |
Mục đích: Theo dõi thời gian thực mức sử dụng CPU và RAM của hệ thống mà không cần mở Task Manager.
Cách hoạt động: Cmdlet Get-Counter truy cập Windows Performance Counters - hệ thống đo lường hiệu năng tích hợp sẵn trong Windows.
Ví dụ giám sát nâng cao:
| powershell Get-Counter 'Processor(_Total)% Processor Time' -Continuous -SampleInterval 2 # Theo dõi CPU liên tục mỗi 2 giây Get-Counter 'Processor(_Total)% Processor Time' -MaxSamples 10 -SampleInterval 1 # Lấy 10 mẫu với khoảng cách 1 giây Get-Counter @('Processor(_Total)% Processor Time', 'MemoryAvailable MBytes', 'PhysicalDisk(_Total)Disk Reads/sec', 'PhysicalDisk(_Total)Disk Writes/sec') # Giám sát nhiều metrics cùng lúc Get-Counter 'Processor(_Total)% Processor Time' -MaxSamples 100 | Export-Counter -Path "C:PerfLogscpu_usage.csv" -FileFormat CSV # Xuất kết quả ra file để phân tích sau |
Các Performance Counter hữu ích khác:
| powershell 'PhysicalDisk(_Total)% Disk Time' # Kiểm tra disk performance 'Network Interface(*)Bytes Total/sec' # Giám sát network 'MemoryPages/sec' # Kiểm tra memory page faults 'SystemProcesses' # Theo dõi số lượng process |
Ứng dụng thực tế:
- Phát hiện sớm tình trạng quá tải trước khi máy chủ bị đơ
- Xác định thời điểm cao điểm để lên kế hoạch nâng cấp phần cứng
- Giám sát hiệu năng sau khi cài đặt phần mềm mới
- Tạo baseline hiệu năng để so sánh khi có vấn đề
Lưu ý: Tên counter có thể khác nhau tùy theo ngôn ngữ Windows. Sử dụng Get-Counter -ListSet * để xem danh sách đầy đủ.
7. Kiểm tra Kết nối mạng
Lệnh Test-NetConnection
| powershell Test-NetConnection -ComputerName "địa_chỉ_IP_hoặc_hostname" -Port số_cổng |
![]() |
Mục đích: Kiểm tra khả năng kết nối mạng đến một máy chủ cụ thể và cổng dịch vụ, thay thế hoàn hảo cho ping và telnet.
Ưu điểm so với ping:
- Kiểm tra được cổng cụ thể (ping chỉ kiểm tra ICMP)
- Hiển thị thông tin chi tiết về kết nối
- Có thể kiểm tra cả tính năng traceroute
Ví dụ sử dụng:
| powershell Test-NetConnection -ComputerName "google.com" -Port 80 # Kiểm tra kết nối web server (port 80) Test-NetConnection -ComputerName "192.168.1.100" -Port 1433 # Kiểm tra kết nối SQL Server (port 1433) Test-NetConnection -ComputerName "server01" -Port 3389 # Kiểm tra RDP (port 3389) Test-NetConnection -ComputerName "8.8.8.8" -TraceRoute # Kiểm tra với traceroute Test-NetConnection -ComputerName "google.com" # Ping đơn giản |
Thông tin được trả về:
- ComputerName: Tên hoặc IP đích
- RemoteAddress: Địa chỉ IP thực tế
- RemotePort: Cổng đã kiểm tra
- TcpTestSucceeded: True/False - kết nối thành công hay thất bại
- PingSucceeded: Kết quả ping
- PingReplyDetails: Thời gian phản hồi (latency)
Ứng dụng thực tế:
- Kiểm tra firewall có chặn cổng dịch vụ không
- Xác minh dịch vụ web/database đang lắng nghe đúng cổng
- Chẩn đoán vấn đề kết nối giữa các máy chủ
- Kiểm tra routing và latency mạng với TraceRoute
Script kiểm tra nhiều máy chủ:
| powershell $servers = @("server01", "server02", "server03") $port = 3389 foreach ($server in $servers) { $result = Test-NetConnection -ComputerName $server -Port $port -WarningAction SilentlyContinue if ($result.TcpTestSucceeded) { Write-Host "$server : Port $port is OPEN" -ForegroundColor Green } else { Write-Host "$server : Port $port is CLOSED" -ForegroundColor Red } } |
8. Tìm File bị thay đổi gần nhất
Lệnh tìm file được chỉnh sửa trong 24 giờ qua
| powershell Get-ChildItem -Recurse | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-1) } |
![]() |
Mục đích: Tìm kiếm các file đã được tạo mới hoặc chỉnh sửa trong khoảng thời gian gần đây, cực kỳ hữu ích khi điều tra sự cố bảo mật hoặc ransomware.
Phân tích cú pháp:
- Get-ChildItem -Recurse: Lấy danh sách tất cả file/folder, bao gồm cả subfolder
- Where-Object: Lọc kết quả theo điều kiện
- $_.LastWriteTime: Thời gian chỉnh sửa cuối cùng của file
- -gt: Greater than (lớn hơn)
- (Get-Date).AddDays(-1): Thời điểm 24 giờ trước
Các biến thể hữu ích:
| powershell Get-ChildItem -Recurse | Where-Object { $_.LastWriteTime -gt (Get-Date).AddHours(-1)} # Tìm file thay đổi trong 1 giờ qua Get-ChildItem -Recurse | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7)} # Tìm file thay đổi trong 7 ngày qua Get-ChildItem -Recurse -File | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-1) } # Tìm file, không bao gồm folder Get-ChildItem -Recurse -Filter *.txt | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-1) } # Tìm file .txt thay đổi gần nhất Get-ChildItem -Recurse -File | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-1) } | Select-Object FullName, LastWriteTime, Length | Sort-Object LastWriteTime -Descending # Hiển thị kết quả có format dễ đọc Get-ChildItem -Recurse -File | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-1) } | Export-Csv -Path "C:/Reportsrecent_files.csv" -NoTypeInformation # Xuất kết quả ra file CSV |
Ứng dụng thực tế:
a. Phát hiện ransomware:
Ransomware thường mã hóa hàng loạt file trong thời gian ngắn, để lại dấu vết thời gian chỉnh sửa bất thường.
| powershell Get-ChildItem -Recurse | Where-Object { $_.LastWriteTime -gt (Get-Date).AddHours(-2) -and $_.Extension -match '.(encrypted|locked|crypto)$' } # Tìm file có extension lạ được tạo cách đây khoảng 2 giờ |
b. Điều tra ai đã chỉnh sửa file quan trọng:
| powershell Get-ChildItem -Path "C:WindowsSystem32config" -Recurse | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-7) } # Tìm file config bị thay đổi |
c. Theo dõi hoạt động người dùng:
| powershell Get-ChildItem -Path "C:Users*Desktop" -Recurse | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-1) } # Tìm file trong Desktop của user bị thay đổi |
Lưu ý hiệu năng: Khi quét ổ cứng lớn hoặc toàn bộ hệ thống, lệnh có thể chạy lâu. Nên giới hạn phạm vi tìm kiếm bằng cách chỉ định đường dẫn cụ thể.
9. Đổi tên file hàng loạt
Lệnh đổi tên file theo pattern
| powershell Get-ChildItem *.txt | Rename-Item -NewName { $_.Name -replace "old","new" } |
![]() |
Mục đích: Đổi tên hàng loạt nhiều file cùng lúc theo quy tắc nhất định, tiết kiệm thời gian so với đổi tên thủ công từng file.
Cách hoạt động:
- Get-ChildItem *.txt: Lấy danh sách tất cả file .txt
- Rename-Item: Cmdlet đổi tên file/folder
- -NewName: Chỉ định tên mới
- $_.Name -replace "old","new": Thay thế chuỗi "old" bằng "new" trong tên file
Các ví dụ thực tế:
| powershell Get-ChildItem *.jpg | Rename-Item -NewName { "Photo_" + $_.Name } # Thêm prefix vào tên file Get-ChildItem *.txt | Rename-Item -NewName { $_.BaseName + "_backup" + $_.Extension } # Thêm suffix trước extension Get-ChildItem *.txt | Rename-Item -NewName { $_.BaseName + ".log" } # Đổi extension Get-ChildItem | Rename-Item -NewName { $_.Name -replace " ","" } # Loại bỏ khoảng trắng trong tên file Hay Get-ChildItem -File *.jpg | Rename-Item -NewName { $_.Name -replace " ","_" } # Xử lý file có định dạng cụ thể (ví dụ: .jpg) thay khoảng trắng bằng gạch dưới $i = 1 Get-ChildItem *.jpg | ForEach-Object { Rename-Item $_ -NewName ("Image_" + $i.ToString("000") + ".jpg") $i++ } # Script đổi tên file theo số thứ tự Get-ChildItem | Rename-Item -NewName { $_.Name.ToLower() } # Chuyển tên file sang chữ thường Get-ChildItem | Rename-Item -NewName { $_.Name.ToUpper() } # Chuyển tên file sang chữ hoa Get-ChildItem *.log | Rename-Item -NewName {(Get-Date -Format "yyyyMMdd_HHmmss") + "_" + $_.Name} # Đổi tên theo ngày giờ |
Ứng dụng thực tế:
VD1: Tổ chức log files:
| powershell Get-ChildItem C:Logs*.log | Rename-Item -NewName {$_.BaseName + "_" + $_.LastWriteTime.ToString("yyyyMMdd") + ".log"} # Thêm timestamp vào log files cũ |
VD2: Chuẩn hóa tên file từ nhiều nguồn:
| powershell Get-ChildItem | Rename-Item -NewName {$_.Name -replace '[^wd.]','_'} # Loại bỏ ký tự đặc biệt không mong muốn |
VD3. Xử lý ảnh hàng loạt:
| powershell $counter = 1 Get-ChildItem *.jpg | Sort-Object CreationTime | ForEach-Object { $newName = "Project_Alpha_" + $counter.ToString("D4") + ".jpg" Rename-Item $_ -NewName $newName $counter++ } # Script đổi tên ảnh theo thứ tự với prefix dự án |
Lưu ý an toàn:
- Luôn kiểm tra trước khi thực thi: Sử dụng Select-Object Name, @{N='NewName'; E={...}} để xem trước tên mới
- Backup dữ liệu quan trọng trước khi đổi tên hàng loạt
- Sử dụng -WhatIf để xem thử kết quả mà không thực sự đổi tên:
10. Tự động hóa nâng cao với PowerShell scripts
Kích hoạt Execution Policy
Thông thường để bảo mật Microsoft không cho phiép người dùng chạy script trên máy vì vậy muốn chạy được bạn phải xác định quyền. Tức người dùng phải chủ động cho phép.
| Get-ExecutionPolicy # Kiểm tra policy hiện tại Set-ExecutionPolicy Bypass -Scope Process # Tạm thời cho phiên hiện tại |
![]() |
Tạo và chạy script PowerShell
| powershell .scriptname.ps1 # Chạy script từ file Set-ExecutionPolicy RemoteSigned # Cho phép chạy script |
VD1: tạo file Scriptname.ps1:
| $i = 1 Get-ChildItem *.jpg | ForEach-Object { Rename-Item $_ -NewName ("Image_" + $i.ToString("000") + ".jpg") $i++ } # Script đổi tên file theo số thứ tự |
VD2: Tạo file AutoBackup.ps1
| $sourceFolder = "C:ImportantData" # Thư mục cần backup $backupFolder = "D:Backups" # Nơi lưu backup $timestamp = Get-Date -Format "yyyyMMdd_HHmmss" $backupPath = "$backupFolderBackup_$timestamp" # Tạo tên backup với ngày giờ Write-Host "Đang backup..." -ForegroundColor Yellow try { # Kiểm tra thư mục nguồn if (!(Test-Path $sourceFolder)) { throw "Không tìm thấy thư mục: $sourceFolder" } # Tạo thư mục backup nếu chưa có if (!(Test-Path $backupFolder)) { New-Item -ItemType Directory -Path $backupFolder -Force | Out-Null } # Thực hiện backup Copy-Item -Path $sourceFolder -Destination $backupPath -Recurse -Force Write-Host "✓ Backup thành công!" -ForegroundColor Green Write-Host "Vị trí: $backupPath" -ForegroundColor Cyan } catch { Write-Host "✗ Lỗi: $_" -ForegroundColor Red exit 1 } |
Mục đích: Tạo các file script (.ps1) để tự động hóa các tác vụ lặp đi lặp lại, biến những quy trình phức tạp thành công cụ đơn giản chỉ cần chạy một lệnh.
Tổng kết
PowerShell không chỉ là công cụ để thực hiện lệnh, nó là nền tảng để bạn xây dựng các giải pháp tự động hóa toàn diện cho hạ tầng IT của mình. Việc thành thạo những lệnh này không chỉ giúp bạn giải quyết vấn đề nhanh hơn mà còn mở ra khả năng tự động hóa các quy trình phức tạp. Hãy bắt đầu áp dụng từng lệnh vào công việc hàng ngày, sau đó kết hợp chúng thành các script mạnh mẽ phù hợp với nhu cầu cụ thể cho tổ chức của bạn.
Chúc bạn thành công!
Anh Xuân









