Windows에서 작업할 때 언젠가는 현재 컴퓨터에 로그인된 사용자 계정을 확인해야 할 때가 있습니다. 다행히도 PowerShell을 사용하여 로컬 또는 원격 컴퓨터에서 현재 사용자를 얻을 수 있습니다.
Active Directory에서 침해당한 암호가 있나요? Specops Password Auditor Free로 확인하세요.
이 튜토리얼에서는 컴퓨터의 현재 사용자를 얻는 여러 가지 방법을 배우게 될 것입니다. 배우게 될 방법에는 기본 명령, .NET 클래스 및 Windows Management Instrumentation (WMI) 특정 cmdlet이 포함됩니다.
당신의 컴퓨터에 은밀히 숨어있는 사람들을 발견할 준비가 되셨나요? 시작해 봅시다!
전제 조건
이 튜토리얼에서는 예제를 따라하는 것이 가장 좋습니다. 그리고 그렇게 하려면 Windows 10, Windows Server 2012 또는 그 이후 버전과 같은 현대 버전의 Windows가 실행되는 컴퓨터가 필요합니다.
이 튜토리얼에서는 DC1이라는 이름의 Windows Server 2019를 실행하는 컴퓨터를 사용합니다.
컴퓨터에 로그인된 현재 사용자를 확인하기 위해 PowerShell을 사용하는 이유는 무엇인가요?
고통을 드립니다. PowerShell을 사용하지 않고도 컴퓨터에 현재 사용자를 로그인시킬 수 있는 방법이 있습니다. 결국 시스템 관리자들은 PowerShell 이전에도 그럴 방법을 가지고 있어야 했을 테니까요. 그렇다면 PowerShell을 사용하는 이유는 무엇일까요?
PowerShell을 사용하여 동일한 작업을 수행하는 것은 결과를 조작할 수 있는 객체로 취급하는 이점이 있습니다. 예를 들어 사용자 자격 증명을 요청하는 스크립트를 실행하면 PowerShell이 프로그래밍 방식으로 사용자 이름을 채우고 비밀번호만 수동으로 입력하면 됩니다.
다른 실제 예로는 서버에 현재 로그인한 사용자 목록을 파일로 내보내는 것이 있습니다. PowerShell을 사용하여 현재 사용자를 가져온 다음 결과를 CSV, HTML 또는 XML 파일로 내보낼 수 있습니다. 그 후 다양한 자동화 워크플로우에서 이 출력을 사용할 수 있습니다.
현재 사용자를 가져오기 위해 PowerShell을 사용하는 수천 가지 이유가 있을 수 있지만, 최종 목표는 모두 귀하의 요구 사항에 달려 있습니다. 이 튜토리얼에서는 이 목표를 달성하기 위한 다양한 방법을 가르쳐 드리겠습니다.
Win32_ComputerSystem 클래스 조회하기
시작하겠습니다. PowerShell의 원래 cmdlet은 Get-WMIObject
와 Get-CimInstance
입니다. 이러한 cmdlet을 사용하면 로컬 또는 원격 컴퓨터에서 Windows Management Instrumentation (WMI) 클래스를 사용하여 현재 로그온한 사용자를 포함한 정보를 조회할 수 있습니다.
Get-WMIObject
은 더 이상 사용되지 않는 이전 cmdlet이며 Windows PowerShell 5.1까지만 사용할 수 있습니다. 반면에Get-CIMInstance
는 더 새롭고 보안이 강화된 cmdlet으로 최신 PowerShell 버전까지 사용할 수 있습니다.
PowerShell을 사용하여 현재 사용자를 가져오려면 Win32_ComputerSystem 클래스을 대상으로 하는 cmdlet을 호출하십시오. Win32_ComputerSystem 클래스에는 Username
속성을 포함하여 다양한 속성이 있습니다. 이를 위해 PowerShell 창을 열고 아래의 명령을 실행하십시오.
참고: Win32_ComputerSystem 클래스를 쿼리하면 컴퓨터에 직접 로그인 한 사용자의 사용자 이름만 반환됩니다 (콘솔 세션). 사용자가 원격으로 로그인 한 경우 (예: 원격 데스크톱), 사용자 이름은 비어 있을 것입니다.
두 명령 모두 아래와 같은 결과를 반환합니다. 현재 사용자가 도메인 사용자 계정인 경우 명령은 도메인 및 사용자 이름(도메인\사용자 이름
)을 반환합니다. 하지만 로컬 사용자 계정의 경우 출력은 컴퓨터\사용자 이름
이 됩니다.

Get-WMIObject
및Get-CimInstance
에는 쿼리할 컴퓨터의 이름을 받는-computerName
이라는 매개변수가 있습니다. 이 매개변수를 사용하면 네트워크의 원격 컴퓨터에서 동일한 정보를 쿼리할 수 있습니다.
그러나 도메인을 제외한 사용자 이름만 필요한 경우, split()
메서드를 사용하여 출력을 분할하는 것이 해결 방법입니다. 아래의 PowerShell 명령을 실행하여 이를 수행할 수 있습니다.
결과적으로 PowerShell은 아래 스크린샷처럼 사용자 부분만 반환합니다.

Windows 환경 변수 읽기
다른 방법으로 PowerShell을 사용하여 컴퓨터에서 현재 사용자를 얻는 방법은 환경 변수에서 값들을 검색하는 것입니다. 환경 변수는 현재 사용자의 사용자 이름을 포함한 운영 체제 데이터를 나타냅니다.
환경 변수와 상호 작용하는 세 가지 방법이 있습니다. 선택한 방법에 관계없이 동일한 결과를 반환합니다.
Env PowerShell 드라이브
PowerShell은 환경 변수를 캐시하고 Env:
드라이브라는 PowerShell 드라이브 (PSDrive)를 통해 이를 사용할 수 있게 합니다. PSDrives는 컴퓨터의 드라이브처럼 액세스할 수 있는 데이터 위치입니다 (예: C:), 그러나 PowerShell 내에서만 액세스할 수 있습니다.
PowerShell은 PowerShell 세션을 열자마자 Env:
드라이브를 자동으로 생성합니다. 그리고 Env:
는 드라이브이기 때문에 파일 시스템 드라이브나 폴더의 내용을 나열하는 것과 유사하게 Get-ChildItem
cmdlet을 사용하여 해당 내용을 얻을 수 있습니다.
PowerShell에서 Env: 드라이브 사용하기 위해 아래 명령을 실행하여 현재 사용자를 가져옵니다.
아래 스크린샷은 예상 결과를 보여줍니다. 보시다시피, 해당 명령은 USERNAME
항목과 해당 값을 반환하며, 이 값은 현재 로그인한 사용자입니다.

사용자 이름 값만 반환하려면 아래와 같이 명령을 수정하고 PowerShell에서 다시 실행하십시오.
그리고 아래 스크린샷에서 보시다시피, 해당 명령은 사용자 이름 값을 문자열로만 반환합니다.

$env 변수
환경 변수를 파일로 취급하여 드라이브에서 액세스하는 것 외에도, 다른 방법은 Env
드라이브를 변수로 사용하여 환경 변수를 참조하는 것입니다. 아래 구문을 사용하여 환경 변수를 참조할 수 있습니다.
위 구문을 기반으로 PowerShell에서 아래 명령을 실행하여 현재 사용자를 얻으십시오.
아래 스크린샷에서 보듯, 해당 명령은 사용자 이름 값을 반환합니다.

.NET 환경 클래스
PowerShell은 객체 지향 언어이자 셸입니다. 본질적으로 PowerShell 내에서 작업하는 모든 것은 객체입니다. 명령을 실행하면 출력이 객체입니다. 변수를 선언하면 해당 변수 자체가 객체입니다. 아이디어를 얻으셨나요?
이러한 객체는 데이터 유형을 정의하는 구조를 갖고 있으며, 청사진과 유사합니다. 이러한 청사진을 .NET 클래스 또는 간단히 클래스라고 합니다.
환경 변수에 대한 클래스는 Environment 클래스입니다. 따라서 PowerShell에서 현재 사용자를 가져오려면 Environment 클래스를 어떻게 사용하나요?
환경 변수처럼 Environment 클래스에는 현재 사용자의 사용자 이름이 값인 Username
속성이 있습니다. 사용자 이름 속성 값을 가져오려면 PowerShell에서 아래 명령을 실행하세요.

Username
속성 외에도 Environment 클래스에는 환경 변수의 값을 가져오는 메서드가 있습니다. 메서드의 이름은 GetEnvironmentVariable
입니다.
이 방법을 사용하여 현재 사용자를 가져오려면 아래 명령을 실행하세요.

.NET WindowsIdentity 클래스 사용
WindowsIdentity 클래스는 PowerShell에서 호출할 수 있는 또 다른 .NET 클래스입니다. 이 클래스에는 현재 사용자를 가져오기 위한 GetCurrentName
이라는 메서드가 있습니다. 이 메서드는 현재 Windows 사용자를 나타내는 개체를 반환합니다.
현재 사용자의 세부 정보를 얻으려면 아래 명령을 실행하십시오.
아래에서 볼 수 있듯이, 이 명령은 현재 사용자 개체 속성을 반환하며, 이 중에는 Name
속성도 포함됩니다. Name
속성 값은 도메인\사용자
형식을 따릅니다.

사용자 이름 부분만 반환하려면 이전 명령을 수정하여 Name
속성만 선택하고, 문자열 분할 기술을 적용하십시오. 이를 위해 아래 명령을 복사하여 PowerShell에서 실행하십시오.

whoami
명령 사용
현재 사용자를 빠르게 가져올 수 있는 또 다른 편리한 명령은 whoami
명령입니다. 이 명령은 %WINDIR%\System32 폴더에서 whoami.exe
라는 파일명으로 찾을 수 있는 실행 파일입니다.
현재 사용자의 사용자 이름을 얻으려면 아래 명령을 실행하십시오.
그러면 명령이 도메인 사용자 이름
형식으로 결과를 반환합니다.

사용자 이름에서 도메인을 제외하려면 아래 명령을 실행하여 이전에 학습한 문자열 분할 기술을 적용하세요.

whoami
명령을 사용하면 현재 사용자의 완전한 정규 구별 이름(FQDN)과 사용자 주요 이름(UPN)을 얻을 수도 있습니다. 이 명령의 출력은 사용자 이름 이상의 현재 사용자 식별 정보를 검색하는 스크립트를 실행할 경우 도움이 될 수 있습니다.
현재 사용자의 FQDN 및 UPN을 얻으려면 PowerShell에서 아래 명령을 실행하세요.

참고: 현재 로그인한 사용자가 도메인 사용자인 경우에만 FQDN 및 UPN 값이 사용 가능합니다. 로컬 사용자에 대해 이러한 값을 가져오려고 시도하면 아래와 같이 오류가 발생합니다.

query
명령 사용
시스템 관리자 또는 도메인 사용자인 경우에는 적어도 한 번은 리모트 데스크톱 프로토콜(RDP)을 통해 원격 컴퓨터에 로그인한 적이 있을 것입니다. 리소스를 관리하거나 응용 프로그램을 사용하기 위해일 수도 있습니다. 어떤 이유든 간에 현재 로그인한 사용자가 누구이며 시스템 리소스를 사용 중인지 알고 싶을 것입니다.
다행히도, 윈도우에는 현재 컴퓨터에 로그인한 모든 사용자를 나열할 수 있는 내장된 명령줄 도구인 query
가 있습니다. 이 명령은 또한 사용자가 원격 데스크톱 세션을 통해 로그인했는지 아니면 컴퓨터에 로컬로 로그인했는지를 보여줍니다.
query
명령에는 로그인한 사용자를 가져오는 데 관련된 두 개의 매개변수가 있습니다. session
및 user
입니다. session
매개변수는 컴퓨터 세션을 나열하고, user
매개변수는 사용자와 그들의 세션을 나열합니다.
query session
명령에는qwinsta
라는 별칭이 있으며,query user
의 명령 별칭은quser
입니다.
예를 들어, 아래 명령을 실행하여 DC1에서 세션을 나열합니다.
아래 스크린샷은 명령의 출력을 보여줍니다. 이 예제에서는 두 명의 사용자가 DC1 컴퓨터에 로그온했습니다. 하나는 콘솔 세션에서이고 다른 하나는 RDP를 통해입니다. qwinsta
가 비사용자 세션까지 모두 반환한다는 것을 볼 수 있습니다.

/server:<computer>
인수없이qwinsta
또는quser
를 실행하면 두 명령 모두 기본적으로 로컬 컴퓨터를 쿼리합니다.
다음으로, 존재하는 로그온 세션을 가진 모든 사용자를 나열하려면 아래의 user
명령을 실행하십시오.
명령을 실행한 후에는 qwinsta
명령과 유사하게 세션 및 사용자가 반환되는 것을 즉시 알 수 있습니다. 그러나 이번에는 빈 세션은 없습니다.
또한 두 가지 추가 열이 있습니다. 사용자의 유휴 시간을 보여주는 IDLE TIME
및 사용자의 로그온 타임스탬프를 보여주는 LOGON TIME
입니다.

마지막으로 qwinsta
와 quser
결과를 비교하면 현재 사용자를 얻기 위해 PowerShell에서 quser
가 더 적합한 명령입니다.
Active Directory에서 보안이 손상된 비밀번호가 있습니까? Specops Password Auditor Free로 확인하세요.
결론
파워쉘에서 현재 로그인한 사용자를 가져오는 여러 가지 방법이 있지만, 어떤 방법이 가장 좋은지는 원하는 결과와 사용 방법에 따라 다릅니다.
네이티브 WMI 관련 cmdlet과 query
명령을 사용하면 로컬 또는 원격 컴퓨터에서 로그인한 사용자를 가져올 수 있습니다. .NET 클래스와 환경 변수를 사용하면 동일한 결과를 빠르게 로컬 컴퓨터에서만 검색할 수 있습니다.
스크립트를 실행하거나 결과를 수동으로 화면에 표시할 계획이든, PowerShell을 사용하여 현재 사용자를 가져오는 데 필요한 요구 사항에 맞는 방법이 있습니다. 그 다음은 무엇을 해야 할까요? 아마도 query 명령 결과를 구문 분석하고 PowerShell 객체로 변환하기 위해 함수를 작성하고 정규식을 사용하는 방법을 배울 수 있을 것입니다.
Source:
https://adamtheautomator.com/powershell-get-current-user/