Windows PowerShell에서 현재 사용자 이름을 얻으려면 어떻게합니까?


답변:


397

찾았어요:

$env:UserName

도 있습니다:

$env:UserDomain
$env:ComputerName

10
빠르고 더러운 대안은 $env:username해당 환경 변수에서 사용자 이름을 검색하는 것입니다.
guillermooo

7
$ env : username과 [Environment] :: UserName이 모두 같은 것을 가리키는 것 같습니다.
Cephas

16
귀하의 질문에 답변 해 주셔서 감사합니다. 누군가가 스스로 답을 알아 내고 단순히 "걱정하지 마라!"라고 대답 할 때 더 이상 실망하지 않습니다.
매트 디트로 리오

6
@MattDiTrolio 확실히 실망 스럽지만 그보다 더 실망스러운 것은 없다고 생각하십니까 ?!
코드 자키

5
@CodeJockey 아무것도 없습니다. 지금까지의 역사에는 없습니다. :)
Matt DiTrolio

180
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name

16
이것은 $env:USERNAME사용자가 변경할 수 있기 때문에 가장 안전한 대답 이지만, 그렇게해도 속지 않을 것입니다.
Kevin Panko

6
@KevinPanko True, 그러나 사용자를 신뢰할 수없는 시점에서 다른 철학적 질문이 더 필요합니다. ;-)
jpaugh

4
이 방법에는 도메인 이름과 사용자 이름이 포함됩니다. 여러 도메인을 사용중인 경우 확실히 도움이됩니다.
Ryan Gates

예상대로 작동합니다. URL 주소 예약 테스트를 거쳤습니다.
Marek Bar

또한 이것은 PowerShell 6에서도 작동하는 것으로 보입니다. 즉, 크로스 플랫폼 (.Net Standard)과 호환됩니다. 네임 스페이스를 볼 때 질문 한 이후 언급 할 가치가 있다고 생각했습니다.
deadlydog December

120

주어진 답변을 요약하고 비교하는 것이 가치가 있다고 생각했습니다.

환경 변수 에 액세스하려면 다음을 수행 하십시오 .

(더 쉽고 짧고 기억에 남는 옵션)

  • [Environment]::UserName -@ThomasBratt
  • $env:username -@ 오인
  • whoami -@galaktor

Windows 액세스 토큰 에 액세스하려는 경우 :

(보다 안정적인 옵션)

  • [System.Security.Principal.WindowsIdentity]::GetCurrent().Name -@MarkSeemann

로그인 한 사용자의 이름을 원할 경우

(PowerShell 인스턴스를 실행하는 사용자 이름이 아닌)

  • $(Get-WMIObject -class Win32_ComputerSystem | select username).username- 이 다른 포럼 에서 @TwonOfAn

비교

@Mark Seemann의 답변에 대한 @Kevin Panko의 의견은 다른 카테고리 중 하나를 선택하는 것을 처리합니다.

사용자가 $ env : USERNAME을 변경할 수 있기 때문에 [Windows 액세스 토큰 접근 방식]이 가장 안전한 답변입니다.

즉, 환경 변수 옵션이 더 간결하고 Windows 액세스 토큰 옵션이 더 신뢰할 수 있습니다.

내가 가장 한 C # 응용 프로그램에서 실행중인 PowerShell 스크립트에서 @Mark Seemann의 Windows 액세스 토큰 접근 방식을 사용해야했습니다.

C # 응용 프로그램은 내 사용자 계정으로 실행되며 PowerShell 스크립트를 서비스 계정으로 실행합니다. C #에서 PowerShell 스크립트를 실행하는 방식의 제한으로 인해 PowerShell 인스턴스는 서비스 계정 사용자로 실행 되더라도 사용자 계정의 환경 변수를 사용합니다.

이 설정에서 환경 변수 옵션은 내 계정 이름을 반환하고 Windows 액세스 토큰 옵션은 서비스 계정 이름 (원하는 이름)을 반환하고 로그인 한 사용자 옵션은 내 계정 이름을 반환합니다.


테스팅

또한 옵션을 직접 비교하려면 다른 사용자로 스크립트를 실행하는 데 사용할 수있는 스크립트가 있습니다. Get-Credential cmdlet을 사용하여 자격 증명 개체를 얻은 다음이 스크립트를 스크립트와 함께 실행하여 다른 사용자를 인수 1로, 자격 증명 개체를 인수 2로 실행해야합니다.

용법:

$cred = Get-Credential UserTo.RunAs
Run-AsUser.ps1 "whoami; pause" $cred
Run-AsUser.ps1 "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name; pause" $cred

Run-AsUser.ps1 스크립트의 내용 :

param(
  [Parameter(Mandatory=$true)]
  [string]$script,
  [Parameter(Mandatory=$true)]
  [System.Management.Automation.PsCredential]$cred
)

Start-Process -Credential $cred -FilePath 'powershell.exe' -ArgumentList 'noprofile','-Command',"$script"

Mac OS X 및 Linux의 PowerShell 6의 [Environment]::UserName경우 크로스 플랫폼에서 작동하는 것이 가장 좋습니다. whoami작동하는 것처럼 보이지만 whoami플랫폼에서 사용 가능한 도구에 따라 다릅니다 .
Florian Feldhaus

Windows에서 파워 쉘 (6)의 경우, $env:USERNAME생산 SYSTEMI 실행-으로 관리자 않는 반면, [Environment]::UserName]수율 내 이름 어느 쪽이든.
kfsone

1
Get-WmiObject방법은 더 이상 pwsh에서 작동하지 않는 것 같습니다. 호환성 모듈을 가져 오려고 시도했지만 Microsoft.PowerShell.Managementcmdlet이 있습니다. 무슨 일인지 알 겠어?
not2qubit 2019

옳은. 성능상의 이유로 Get-CimInstance로 꽤 오래 전부터 사용되었습니다. CIM v6의 WMI에서 교차 호환성을 위해 사용해야합니다. GWMI와 함께 명령이 표시되면 대신 GCIM을 수행 할 수 있는지 확인하십시오.
Hicsy

105

$env:username 가장 쉬운 방법입니다


이런 식으로 할당하고 디렉토리를 구축 할 수 있습니다.
Droogans

51

whoami 명령 을 던지고 싶습니다. 기본적으로 %USERDOMAIN%\%USERNAME%다른 답변에서 제안한대로 좋은 별칭입니다 .

Write-Host "current user:"
Write-Host $(whoami)

그것은 PS 버전 2에서 나를 위해 작동합니다. PS3에서 삭제되었다고 말하고 있습니까? C : \> powershell Windows PowerShell 저작권 (C) 2009 Microsoft Corporation. 판권 소유. PS C : \> whoami mydomain \ myusername
galaktor

2
$env:USERNAME사용자가 변경할 수는 있지만 그렇게해도 속지 않습니다.
Kevin Panko

3
whoami는 대화식 사용으로 승리합니다. SO :-)와상의하지 않고 타이핑하는 방법을 기억할 수있을만큼 짧습니다.
Iain Samuel McLean Elder

Nano 서버에는 없습니다. 스크립트에서 사용하지 말고 올바른 일을하십시오 ( [System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
또 다른 사용자

whoami실행 파일입니다. PowerShell에서 제거 할 수 없습니다. 잠재적으로 Windows에서 제거 될 수 있지만 Nano 이외의 Windows Server 2012에서는 여전히 존재합니다.
jpmc26

37

[Environment]::UserName사용자 이름 만 반환합니다. 예를 들어 bob [System.Security.Principal.WindowsIdentity]::GetCurrent().Name 은 도메인 이름이 접두사로 붙은 경우 사용자 이름을 반환합니다. 예 : SOMEWHERENICE \ bob


12

나는 $env:username과거에 사용했지만 동료는 환경 변수이며 사용자가 변경할 수 있다고 지적 했으므로 현재 사용자의 사용자 이름을 실제로 얻으려면 그것을 신뢰해서는 안됩니다.

Mark Seemann의 답변을 공표했습니다. [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Name

그러나 나는 허용되지 않습니다. Mark의 답변으로 사용자 이름 만 필요하면 내 시스템에서 사용자 이름을 구문 분석해야 hostname\username하며 도메인 계정이있는 도메인 가입 컴퓨터에서 반환 domain\username됩니다.

whoami.exe모든 버전의 Windows에 존재하지 않기 때문에 사용하지 않을 것이며 다른 바이너리를 불러오고 일부 보안 팀에 적합 할 수 있습니다.


1
OP가 Windows-Powershell에 대해 [Environment]::UserName$env:username
묻었으므로

12

이제 PowerShell Core (일명 v6)가 릴리스되었고 사람들이 크로스 플랫폼 스크립트를 작성하려고 할 수 있으므로 여기의 많은 답변이 Windows 이외의 다른 곳에서는 작동하지 않습니다.

[Environment]::UserName 코드에 플랫폼 감지 및 특수 케이스를 추가하지 않으려는 경우 PowerShell Core에서 지원하는 모든 플랫폼에서 현재 사용자 이름을 얻는 가장 좋은 방법 인 것 같습니다.


10

여기 다른 사람들의 작업을 기반으로합니다.

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")

1
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

$username

번째 사용자 이름 은 복사하여 붙여 넣은 경우에만 표시됩니다.


$ fullname = Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username $ username = $ fullname.Replace ( "DOMAIN \", "") $ username
clayton.nichols

-1

추가 유형 기반 예제 는 보지 못했습니다 . 다음은 advapi32.dll에서 직접 GetUserName을 사용하는 것입니다.

$sig = @'
[DllImport("advapi32.dll", SetLastError = true)]
public static extern bool GetUserName(System.Text.StringBuilder sb, ref Int32 length);
'@

Add-Type -MemberDefinition $sig -Namespace Advapi32 -Name Util

$size = 64
$str = New-Object System.Text.StringBuilder -ArgumentList $size

[Advapi32.util]::GetUserName($str, [ref]$size) |Out-Null
$str.ToString()

1
이 코드가 수행하는 작업과 더 짧은 방법 중 하나보다 유용한 이유를 설명하십시오.
Benjamin Hubbard

@ BenjaminHubbard 질문은 가장 짧은 방법을 요구하지 않고 powershell로 위업을 달성하는 방법을 묻습니다. 이것은 dll 내부의 함수를 호출하고 Add-Type 메서드를 사용하여 .NET에 액세스하여 다른 예제와 다르게 트릭을 수행합니다.
너클-드래 거

1
이것은 새로운 코드 블록이지만 도대체 무슨 일이 있었는지 알면 좋을 것입니다. 댓글로 주석을 달 수 있습니까? 감사!
jpaugh

1
나는 제안에 대한 장점을 보았 기 때문에 투표를 거의 원했다. 그러나 코드는 몇 가지 결함이있다 : 그것은 새로운 네임 스페이스를 소개하고,이 값이 규정 된 의사 (수 있어야 것이 아니다 마법 상수 (64)를 사용 UNLEN+1하고, UNLEN256이다), 그것은 getUserName 메서드에서 반환 할 수있는 오류 (을 통해 무시 좋은 점은 GetLastError를 유지하고 문자열 버퍼를 정리하지는 않습니다. 그리고 아마도 다른 사람들도있을 것입니다. 그리고 다른 사람들이 말했듯이 의견도 너무 빠졌습니다.
AntoineL

-1

사용하기 가장 쉬운 방법은 다음과 같습니다. cd $ home \ Desktop \

현재 사용자 데스크탑으로 이동합니다

내 경우에는 스크립트가 경로를 변경할 수 있도록 사용자 이름을 검색해야했습니다. c : \ 사용자 \ % 사용자 이름 % 사용자 데스크탑 경로를 변경하여 스크립트를 시작해야했습니다. get-location 애플릿을 사용하여 위와 다른 곳의 도움 으로이 작업을 수행 할 수있었습니다.

다른 방법이 있거나 더 좋은 방법이 있지만 이것이 나를 위해 일했습니다.

$ 경로 = 도착 위치

설정 위치 $ Path \ Desktop


홈 디렉토리를 기반으로 한 가정은 매우 특정한 조건에서만 작동하도록되어 있습니다.
Raúl Salinas-Monteagudo 19

powershell 터미널에서 작업하고 있고 현재 사용자를 빨리 찾으려면 "ls ~"를 입력하면 문제가 해결됩니다. 위의 포스터와 마찬가지로 예외가있을 수 있으며 이는 스크립트에 적합하지 않으므로이 경우 Edouard Poor의 예를 사용하십시오.
MrBerta

-2

배치에 익숙한 경우 전화 할 수 있습니다.

$user=$(cmd.exe /c echo %username%)

기본적으로 "echo % username %"의 배치 파일이있는 경우 얻을 수있는 결과를 훔칩니다.


1
a) 당신 $(...)은 불필요 합니다 : a) 당신 은 불필요합니다 : $a = cmd.exe /c echo %username%작동합니다. 예를 들어 물고기에게 물고기를주는 것보다 낚싯대를주는 것이 좋습니다 powershell puts environment variables into $env, so %username% = $env:username.
kfsone

-2
  1. get-content "cm.txt"
  2. write-host "entr file name" $file = read-host get-content $file
  3. $content = get-content "cm.txt"
  4. $content = get-content "cn.txt" for each ($line in $count) {write-host $line}

$ contents = get-content "cm.txt"---- $ count = 0 ----- foreach ($ count의 $ line) ---- {$ count = $ count + 1} ---- write -host "당신은이 줄을 많이 가지고 있습니다 :"$ count
ammy

1. $ a = $ com1, $ com2 ------ 쓰기 호스트 "cm 이름 입력"---- $ c = readhost ----- write-host $ a [$ c-1] .username , write-host $ a [$ c-1] .password
ammy

$ com1 = 새 개체 PSobject ----- $ com1 = $ com1 | 추가 멤버 noteproperty -name username -value 2016
ammy

1
자신의 답변에 주석으로 코드를 추가하는 이유가 있습니까?
aldr

1
왜 아무도 그것을 이해하지 못하는 곳에서 주석으로 나누지 않고 답변을 편집하고 코드를 추가하지 않습니까?
aldr

-4

내 경우에는 스크립트가 경로를 변경할 수 있도록 사용자 이름을 검색해야했습니다. c:\users\%username%\. 사용자 데스크탑 경로를 변경하여 스크립트를 시작해야했습니다. get-location 을 사용하여 위와 다른 곳의 도움을 받아이 작업을 수행 할 수있었습니다. 애플릿 .

다른 방법이 있거나 더 좋은 방법이 있지만 이것이 나를 위해 일했습니다.

$Path = Get-Location

Set-Location $Path\Desktop

1
스택 오버플로에 오신 것을 환영합니다 ! 이는에 해당합니다 Set-Location Desktop. ( Get-Location단지 현재 경로를 반환 Set-Location하며 상대 경로를 사용하여 암시 적입니다 .)
jpaugh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.