Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

원격 Windows 컴퓨터에 로그온한 사용자 확인 방법 – PSLoggedOn, Qwinsta, PowerShell

시스템 관리자는 원격 Windows 컴퓨터에 현재 로그온한 사용자가 누구인지 빠르게 확인해야 하는 경우가 자주 있습니다. 이 글에서는 원격 컴퓨터에 로그온한 사용자 이름을 조회하는 데 유용한 도구와 PowerShell 스크립트를 소개합니다.

목차

  • PSLoggedOn 및 Qwinsta로 로그온 사용자 확인하기
  • PowerShell로 원격 컴퓨터의 현재 사용자 가져오는 방법
  • 원격 컴퓨터의 로그온 사용자를 찾는 PowerShell 스크립트

PSLoggedOn 및 Qwinsta로 로그온 사용자 확인하기

Microsoft SysInternals PSTools에는 PSLoggedOn.exe라는 콘솔 유틸리티가 포함되어 있으며, 이를 사용하면 원격 컴퓨터에 로그온한 사용자 이름과 해당 컴퓨터에 연결된 SMB 세션 목록을 확인할 수 있습니다.

도구를 다운로드한 후 아래 명령을 실행합니다:

psloggedon \\RemoteCompName

실행 결과에서 로컬에 로그온한 사용자(Users logged on locally)와 네트워크를 통해 이 컴퓨터의 SMB 리소스에 접근 중인 사용자 목록(Users logged on via resource shares)을 확인할 수 있습니다.

로컬에 로그온한 사용자 이름만 확인하려면 -l 옵션을 사용합니다:

Psloggedon.exe \\pc1215wks1 -l

PSLoggedOn은 레지스트리에 연결하여 로컬에 로그온한 사용자 이름을 확인합니다. 이를 위해서는 대상 컴퓨터에서 RemoteRegistry 서비스가 실행 중이어야 합니다. PowerShell을 사용해 서비스를 시작하고 자동 시작으로 설정할 수 있습니다:

Set-Service RemoteRegistry -startuptype automatic -passthru
Start-Service RemoteRegistry

또한 Windows에 기본 내장된 qwinsta 도구를 사용해 원격 컴퓨터의 세션 목록을 확인할 수도 있습니다. RDS(원격 데스크톱 서비스) 터미널 환경을 관리하는 관리자라면 이 도구가 익숙할 것입니다. 원격 컴퓨터에서 로그온 세션 목록을 가져오려면 다음 명령을 실행합니다:

qwinsta /server:be-rdsh01

이 도구는 RDS 서버 또는 Windows 10(11) 데스크톱 에디션(다중 RDP 연결을 허용한 경우 포함)의 모든 세션, 즉 활성 세션과 RDP 시간 초과로 연결이 끊긴 세션까지 모두 반환합니다.

qwinsta로 원격 서버에 연결할 때 Error 5 Access Denied(액세스 거부) 오류가 발생한다면, 원격 호스트에서 RPC를 통한 원격 사용자 관리가 허용되어 있는지 확인하세요. 필요하면 다음 명령이나 GPO를 통해 레지스트리에서 이를 활성화할 수 있습니다:

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v "AllowRemoteRPC" /t "REG_DWORD" /d "1" /f

PowerShell로 원격 컴퓨터의 현재 사용자 가져오는 방법

Win32_ComputerSystem WMI 클래스를 사용하면 컴퓨터에 로그온한 사용자 이름을 확인할 수 있습니다. PowerShell 콘솔을 열고 다음 명령을 실행합니다:

Get-WmiObject -class Win32_ComputerSystem | Format-List Username

이 명령은 해당 컴퓨터에 로그온한 사용자 이름을 반환합니다.

Get-WmiObject cmdlet에는 원격 컴퓨터의 WMI 개체에 접근할 수 있는 -ComputerName 옵션이 있습니다. 다음 명령은 원격 컴퓨터에서 로그온한 사용자 이름을 반환합니다:

(Get-WmiObject -class Win32_ComputerSystem -ComputerName pc1215wks1).Username

이 명령은 콘솔에 직접 로그온한 사용자만 표시하며, RDP를 통한 접속 사용자는 포함되지 않습니다. 도메인 정보 없이 사용자 이름만 얻으려면 다음 명령을 사용합니다:

$userinfo = Get-WmiObject -ComputerName pc1215wks1 -Class Win32_ComputerSystem
$user = $userinfo.UserName -split '\\'
$user[1]

최신 PowerShell Core(pwsh.exe) 버전에서는 Get-WmiObject 대신 Get-CimInstance cmdlet을 사용해야 합니다:

Get-CimInstance -ComputerName pc1215wks1 -ClassName Win32_ComputerSystem | Select-Object UserName

또는 다음과 같이 실행할 수도 있습니다:

(Get-CimInstance -ComputerName pc1215wks1 -ClassName Win32_ComputerSystem).CimInstanceProperties | where{$_.Name -like "UserName"} | select value

Get-CimInstance는 WinRM을 통해 원격 컴퓨터에 연결하므로, 대상 컴퓨터에서 GPO나 다음 명령을 사용해 WinRM을 사전에 활성화하고 구성해야 합니다:

WinRM quickconfig

원격 컴퓨터의 로그온 사용자를 찾는 PowerShell 스크립트

여러 컴퓨터에서 로그온 사용자 정보를 한 번에 수집하려면 다음 PowerShell 함수를 활용할 수 있습니다.

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
}
}

Get-LoggedUser 함수에 확인하려는 컴퓨터 이름을 지정하여 실행합니다:

Get-LoggedUser pc1215wks1,pc1215wks2,mun-dc01

함수가 특정 컴퓨터에 대해 빈 사용자 이름을 반환하면, 해당 컴퓨터에 로그온한 사용자가 없다는 의미입니다.

Active Directory 도메인에 속한 컴퓨터들의 로그온 사용자 이름도 확인할 수 있습니다. Get-ADComputer cmdlet을 사용해 도메인 내 컴퓨터 목록을 가져오면 됩니다. 아래 예제에서는 특정 OU 내 활성 상태의 컴퓨터에 로그온한 사용자 이름을 조회합니다. 스크립트 실행 속도를 높이기 위해 원격 컴퓨터에 접근하기 전에 ICMP ping과 Test-NetConnection cmdlet으로 가용성을 먼저 확인하도록 구성했습니다:

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

참고로, AD 컴퓨터 개체 속성에 로그온 사용자 이름을 저장해 두는 방법도 있습니다. 이를 위해서는 "Set-ADComputer: AD 컴퓨터 속성에 사용자 정보 추가하기" 문서에서 설명하는 로그온 스크립트를 활용하면 됩니다.

이렇게 설정해 두면 특정 사용자가 어디에 로그온했는지 찾기 위해 모든 컴퓨터를 일일이 스캔할 필요가 없습니다. 간단한 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