Thường xuyên quản trị viên cần nhanh chóng tìm ra tên người dùng đang đăng nhập trên máy tính Windows từ xa. Trong bài viết này, chúng tôi sẽ chỉ một số công cụ và script PowerShell có thể giúp bạn lấy tên người dùng đã đăng nhập trên máy tính từ xa.
Kiểm tra người dùng đã đăng nhập với PSLoggedOn và Qwinsta
SysInternals PSTools của Microsoft bao gồm tiện ích console gọi là PSLoggedOn.exe có thể được sử dụng để lấy tên người dùng đang đăng nhập vào máy tính từ xa, cũng như danh sách phiên SMB kết nối với nó.
Tải xuống công cụ và chạy nó:
psloggedon \\RemoteCompName

Như bạn thấy, công cụ trả về tên người dùng đã đăng nhập cục bộ (Users logged on locally) và danh sách người dùng truy cập tài nguyên SMB của máy tính này qua mạng (Users logged on via resource shares).
Nếu bạn chỉ muốn lấy tên người dùng đăng nhập cục bộ, sử dụng tùy chọn -l:
Psloggedon.exe \\pc1215wks1 –l
PSLoggedOn kết nối với registry và kiểm tra tên người dùng đăng nhập cục bộ. Để làm điều đó, dịch vụ RemoteRegistry phải đang chạy. Bạn có thể chạy và cấu hình khởi động tự động dịch vụ bằng PowerShell:
Set-Service RemoteRegistry –startuptype automatic –passthru
Start-Service RemoteRegistry
Bạn cũng có thể lấy danh sách phiên trên máy tính từ xa bằng công cụ tích hợp sẵn qwinsta. Công cụ này nên quen thuộc với bất kỳ quản trị viên nào quản lý môi trường terminal Remote Desktop Services (RDS). Để lấy danh sách phiên người dùng đã đăng nhập từ máy tính từ xa, chạy lệnh:
qwinsta /server:be-rdsh01

Công cụ trả về danh sách tất cả các phiên (active và disconnected do timeout RDP) trên máy chủ RDS hoặc trong Windows 10 (11) desktop (ngay cả nếu bạn cho phép nhiều kết nối RDP đến nó).
Nếu bạn nhận được Error 5 Access Denied khi cố gắng kết nối với máy chủ từ xa bằng qwinsta, hãy đảm bảo máy chủ từ xa được phép quản lý người dùng từ xa qua RPC. Nếu cần, bật nó trong registry bằng lệnh sau hoặc bằng GPO:
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v "AllowRemoteRPC" /t "REG_DWORD" /d "1" /f
Cách lấy người dùng hiện tại trên máy tính từ xa bằng PowerShell?
Bạn có thể lấy tên người dùng đăng nhập trên máy tính bằng lớp WMI Win32_ComputerSystem. Mở console PowerShell và chạy lệnh:
Get-WmiObject -class Win32_ComputerSystem | Format-List Username
Lệnh trả về tên người dùng đăng nhập trên máy tính.

Cmdlet Get-WmiObject có tùy chọn –ComputerName bạn có thể sử dụng để truy cập đối tượng WMI trên máy tính từ xa. Lệnh sau sẽ trả về username đã đăng nhập từ máy tính từ xa:
(Get-WmiObject -class Win32_ComputerSystem –ComputerName pc1215wks1).Username

Lệnh chỉ hiển thị người dùng đăng nhập trên console (không qua RDP).
Bạn cũng có thể sử dụng PSRemoting để lấy thông tin từ máy tính từ xa với cmdlet Invoke-Command.
Bạn có thể chỉ lấy username trên máy tính từ xa (không có domain), sử dụng các lệnh này:
$userinfo = Get-WmiObject -ComputerName pc1215wks1 -Class Win32_ComputerSystem
$user = $userinfo.UserName -split '\\'
$user[1]
Trong các phiên bản PowerShell Core (pwsh.exe) hiện đại, bạn cần sử dụng cmdlet Get-CimInstance thay vì Get-WmiObject:
Get-CimInstance –ComputerName pc1215wks1 –ClassName Win32_ComputerSystem | Select-Object UserName
Hoặc:
(Get-CimInstance -ComputerName pc1215wks1 -ClassName Win32_ComputerSystem).CimInstanceProperties | where{$_.Name -like "UserName"}| select value

GetCiminstance sử dụng WinRM để kết nối với máy tính từ xa nên bạn phải bật và cấu hình WinRM trên chúng bằng GPO hoặc lệnh sau:
WinRM quickconfig
Script PowerShell tìm người dùng đã đăng nhập trên máy tính từ xa
Nếu bạn muốn thu thập thông tin về người dùng đã đăng nhập từ nhiều máy tính, bạn có thể sử dụng function PowerShell sau để lấy username.
function Get-LoggedUser { [CmdletBinding()] param ( [string[]]$ComputerName ) foreach ($comp in $ComputerName) { $output = @{'Computer' = $comp } $output.UserName = (Get-WmiObject -Class win32_computersystem -ComputerName $comp).UserName [PSCustomObject]$output } }
Chỉ định tên máy tính bạn muốn kiểm tra username với Get-LoggedUser:
Get-LoggedUser pc1215wks1,pc1215wks2,mun-dc01

Nếu function trả về username trống cho một máy tính, có nghĩa là không ai đăng nhập.
Bạn có thể lấy tên người dùng đã đăng nhập trên máy tính trong domain Active Directory. Sử dụng cmdlet Get-ADComputer để lấy danh sách máy tính trong domain. Trong ví dụ dưới đây, chúng ta sẽ lấy username đăng nhập trên máy tính hoạt động trong OU domain cụ thể. Để làm cho script chạy nhanh hơn trước khi truy cập máy tính từ xa, tôi đã thêm kiểm tra tính khả dụng bằng ICMP ping và cmdlet Test-NetConnection:
function Get-LoggedUser { [CmdletBinding()] param ( [string[]]$ComputerName ) foreach ($comp in $ComputerName) { if ((Test-NetConnection $comp -WarningAction SilentlyContinue).PingSucceeded -eq $true) { $output = @{'Computer' = $comp } $output.UserName = (Get-WmiObject -Class win32_computersystem -ComputerName $comp).UserName } else { $output = @{'Computer' = $comp } $output.UserName = "offline" } [PSCustomObject]$output } } $computers = (Get-AdComputer -Filter {enabled -eq "true"} -SearchBase 'OU=Berlin,DC=woshub,DC=com').Name Get-LoggedUser $computers |ft -AutoSize

Cũng lưu ý rằng bạn có thể lưu tên người dùng đã đăng nhập trong thuộc tính máy tính trong AD. Để làm điều đó, bạn có thể sử dụng script logon được mô tả trong bài viết "Set-ADComputer: How to Add User Information to AD Computer Properties".
Sau đó, bạn không cần quét tất cả máy tính để tìm nơi một người dùng cụ thể đang đăng nhập. Bạn có thể tìm máy tính của người dùng bằng truy vấn đơn giản đến Active Directory:
$user='m.smith'
$user_cn=(Get-ADuser $user -properties *).DistinguishedName
Get-ADComputer -Filter "ManagedBy -eq '$user_cn'" -properties *|select name,description,managedBy|ft