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.