Thông thường, quản trị viên cần nhanh chóng tìm ra tên người dùng đã đăng nhập trên máy tính Windows từ xa. Trong bài viết này, chúng tôi sẽ giới thiệu một số công cụ và tập lệnh PowerShell có thể giúp bạn lấy tên của người dùng đã đăng nhập trên máy tính từ xa.
Nội dung:
- Kiểm tra Người dùng đã đăng nhập bằng PSLoggedOn và Qwinsta
- Làm thế nào để đưa người dùng hiện tại sử dụng máy tính từ xa bằng PowerShell?
- Tập lệnh PowerShell để tìm 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 bằng PSLoggedOn và Qwinsta
Microsoft’s SysInternals PSTools bao gồm một tiện ích bảng điều khiển có tên PSLoggedOn.exe có thể được sử dụng để lấy tên của người dùng đã đăng nhập vào máy tính từ xa, cũng như danh sách các phiên SMB được kết nối với máy tính đó.
Tải xuống công cụ và chạy nó:
psloggedon \\RemoteCompName
Như bạn có thể thấy, công cụ đã trả lại tên của người dùng đã đăng nhập ( Người dùng đã đăng nhập cục bộ ) và danh sách những người dùng truy cập tài nguyên SMB của máy tính này qua mạng ( Người dùng đã đăng nhập qua chia sẻ tài nguyên ).
Nếu bạn chỉ muốn lấy tên của người dùng đã đăng nhập cục bộ, hãy sử dụng -l tùy chọn:
Psloggedon.exe \\pc1215wks1 –l
PSLoggedOn kết nối với sổ đăng ký và kiểm tra tên của người dùng đã đăng nhập cục bộ. Để làm điều đó, RemoteRegistry dịch vụ phải đang chạy. Bạn có thể chạy và định cấu hình khởi động dịch vụ tự động bằng PowerShell :
Set-Service RemoteRegistry –startuptype automatic –passthru
Start-Service RemoteRegistry
Bạn cũng có thể nhận danh sách các phiên trên máy tính từ xa bằng qwinsta
tích hợp sẵn dụng cụ. 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 đầu cuối Dịch vụ Máy tính Từ xa (RDS). Để nhận danh sách các phiên người dùng đã ghi nhật ký từ một máy tính từ xa, hãy chạy lệnh:
qwinsta /server:be-rdsh01
Công cụ trả về danh sách tất cả các phiên (đang hoạt động và bị ngắt kết nối bởi thời gian chờ RDP) trên máy chủ RDS hoặc trong phiên bản Windows 10 (11) trên máy tính để bàn (ngay cả khi bạn cho phép nhiều kết nối RDP với nó).
Nếu bạn gặp phải Lỗi 5 Quyền truy cập bị Từ chối khi cố gắng kết nối với máy chủ từ xa bằng qwinsta, hãy đảm bảo rằng máy chủ lưu trữ được phép quản lý từ xa người dùng thông qua RPC. Nếu cần, hãy kích hoạt nó trong sổ đăng ký bằng lệnh sau hoặc sử dụng GPO:
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v "AllowRemoteRPC" /t "REG_DWORD" /d "1" /f
Làm cách nào để đưa người dùng hiện tại lên máy tính từ xa bằng PowerShell?
Bạn có thể lấy tên của người dùng đã đăng nhập vào máy tính bằng Win32_ComputerSystem Lớp WMI. Mở bảng điều khiển PowerShell và chạy lệnh:
Get-WmiObject -class Win32_ComputerSystem | Format-List Username
Lệnh trả về tên của người dùng đã đăng nhập vào máy tính.
Lệnh ghép ngắn Get-WmiObject có –ComputerName tùy chọn bạn có thể sử dụng để truy cập các đối tượng WMI trên máy tính từ xa. Lệnh sau sẽ trả về tên người dùng đã đă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 vào bảng điều khiển (không thông qua RDP).
Bạn cũng có thể sử dụng PSRemoting để lấy thông tin từ các máy tính từ xa bằng lệnh ghép ngắn Invoke-Command.YOu chỉ có thể lấy tên người dùng trên máy tính từ xa (không có miền), hãy sử dụng các lệnh sau:
$userinfo = Get-WmiObject -ComputerName pc1215wks1 -Class Win32_ComputerSystem
$user = $userinfo.UserName -split '\\'
$user[1]
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 các máy tính từ xa, vì vậy bạn phải bật và định cấu hình WinRM trên chúng bằng GPO hoặc lệnh sau:
WinRM quickconfig
Tập lệnh 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 hàm PowerShell sau để lấy tên người dùng.
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 tên người dùng bằng Get-LoggedUser:
Get-LoggedUser pc1215wks1,pc1215wks2,mun-dc01
Nếu hàm trả về tên người dùng trống cho một máy tính, điều đó có nghĩa là không ai đăng nhập.
Bạn có thể lấy tên của người dùng đã đăng nhập trên máy tính trong miền Active Directory. Sử dụng lệnh ghép ngắn Get-ADComputer để lấy danh sách các máy tính trong miền. Trong ví dụ dưới đây, chúng tôi sẽ lấy tên người dùng được đăng nhập trên các máy tính đang hoạt động trong OU miền cụ thể. Để làm cho tập lệnh hoạt động nhanh hơn trước khi truy cập vào một máy tính từ xa, tôi đã thêm kiểm tra tính khả dụng của nó bằng cách sử dụng ping ICMP và lệnh ghép ngắn 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
Ngoài ra, lưu ý rằng bạn có thể lưu trữ tên của người dùng đã đăng nhập trong thuộc tính máy tính trong AD. Để thực hiện, bạn có thể sử dụng tập lệnh đăng nhập được mô tả trong bài viết “Set-ADComputer:Cách thêm thông tin người dùng vào thuộc tính máy tính AD”.
Sau đó, bạn không cần phải quét tất cả các máy tính để tìm nơi đăng nhập của một người dùng cụ thể. Bạn có thể tìm thấy một máy tính người dùng bằng một truy vấn đơn giản tới 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