답변:
찾았어요:
$env:UserName
도 있습니다:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:USERNAME
사용자가 변경할 수 있기 때문에 가장 안전한 대답 이지만, 그렇게해도 속지 않을 것입니다.
주어진 답변을 요약하고 비교하는 것이 가치가 있다고 생각했습니다.
(더 쉽고 짧고 기억에 남는 옵션)
[Environment]::UserName
-@ThomasBratt$env:username
-@ 오인whoami
-@galaktor(보다 안정적인 옵션)
[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"
[Environment]::UserName
경우 크로스 플랫폼에서 작동하는 것이 가장 좋습니다. whoami
작동하는 것처럼 보이지만 whoami
플랫폼에서 사용 가능한 도구에 따라 다릅니다 .
$env:USERNAME
생산 SYSTEM
I 실행-으로 관리자 않는 반면, [Environment]::UserName]
수율 내 이름 어느 쪽이든.
Get-WmiObject
방법은 더 이상 pwsh에서 작동하지 않는 것 같습니다. 호환성 모듈을 가져 오려고 시도했지만 Microsoft.PowerShell.Management
cmdlet이 있습니다. 무슨 일인지 알 겠어?
whoami 명령 을 던지고 싶습니다. 기본적으로 %USERDOMAIN%\%USERNAME%
다른 답변에서 제안한대로 좋은 별칭입니다 .
Write-Host "current user:"
Write-Host $(whoami)
$env:USERNAME
사용자가 변경할 수는 있지만 그렇게해도 속지 않습니다.
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)
whoami
실행 파일입니다. PowerShell에서 제거 할 수 없습니다. 잠재적으로 Windows에서 제거 될 수 있지만 Nano 이외의 Windows Server 2012에서는 여전히 존재합니다.
나는 $env:username
과거에 사용했지만 동료는 환경 변수이며 사용자가 변경할 수 있다고 지적 했으므로 현재 사용자의 사용자 이름을 실제로 얻으려면 그것을 신뢰해서는 안됩니다.
Mark Seemann의 답변을 공표했습니다. [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Name
그러나 나는 허용되지 않습니다. Mark의 답변으로 사용자 이름 만 필요하면 내 시스템에서 사용자 이름을 구문 분석해야 hostname\username
하며 도메인 계정이있는 도메인 가입 컴퓨터에서 반환 domain\username
됩니다.
whoami.exe
모든 버전의 Windows에 존재하지 않기 때문에 사용하지 않을 것이며 다른 바이너리를 불러오고 일부 보안 팀에 적합 할 수 있습니다.
이제 PowerShell Core (일명 v6)가 릴리스되었고 사람들이 크로스 플랫폼 스크립트를 작성하려고 할 수 있으므로 여기의 많은 답변이 Windows 이외의 다른 곳에서는 작동하지 않습니다.
[Environment]::UserName
코드에 플랫폼 감지 및 특수 케이스를 추가하지 않으려는 경우 PowerShell Core에서 지원하는 모든 플랫폼에서 현재 사용자 이름을 얻는 가장 좋은 방법 인 것 같습니다.
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
두 번째 사용자 이름 은 복사하여 붙여 넣은 경우에만 표시됩니다.
추가 유형 기반 예제 는 보지 못했습니다 . 다음은 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()
UNLEN+1
하고, UNLEN
256이다), 그것은 getUserName 메서드에서 반환 할 수있는 오류 (을 통해 무시 좋은 점은 GetLastError를 유지하고 문자열 버퍼를 정리하지는 않습니다. 그리고 아마도 다른 사람들도있을 것입니다. 그리고 다른 사람들이 말했듯이 의견도 너무 빠졌습니다.
사용하기 가장 쉬운 방법은 다음과 같습니다. cd $ home \ Desktop \
내 경우에는 스크립트가 경로를 변경할 수 있도록 사용자 이름을 검색해야했습니다. c : \ 사용자 \ % 사용자 이름 % 사용자 데스크탑 경로를 변경하여 스크립트를 시작해야했습니다. get-location 애플릿을 사용하여 위와 다른 곳의 도움 으로이 작업을 수행 할 수있었습니다.
다른 방법이 있거나 더 좋은 방법이 있지만 이것이 나를 위해 일했습니다.
$ 경로 = 도착 위치
설정 위치 $ Path \ Desktop
배치에 익숙한 경우 전화 할 수 있습니다.
$user=$(cmd.exe /c echo %username%)
기본적으로 "echo % username %"의 배치 파일이있는 경우 얻을 수있는 결과를 훔칩니다.
$(...)
은 불필요 합니다 : a) 당신 은 불필요합니다 : $a = cmd.exe /c echo %username%
작동합니다. 예를 들어 물고기에게 물고기를주는 것보다 낚싯대를주는 것이 좋습니다 powershell puts environment variables into $env, so %username% = $env:username
.
get-content "cm.txt"
write-host "entr file name"
$file = read-host
get-content $file
$content = get-content "cm.txt"
$content = get-content "cn.txt"
for each ($line in $count)
{write-host $line}
내 경우에는 스크립트가 경로를 변경할 수 있도록 사용자 이름을 검색해야했습니다. c:\users\%username%\
. 사용자 데스크탑 경로를 변경하여 스크립트를 시작해야했습니다. get-location 을 사용하여 위와 다른 곳의 도움을 받아이 작업을 수행 할 수있었습니다. 애플릿 .
다른 방법이 있거나 더 좋은 방법이 있지만 이것이 나를 위해 일했습니다.
$Path = Get-Location
Set-Location $Path\Desktop
$env:username
해당 환경 변수에서 사용자 이름을 검색하는 것입니다.