Windows PowerShell에서 현재 사용자 이름을 얻으려면 어떻게 해야 합니까?
Windows PowerShell에서 현재 사용자 이름을 얻으려면 어떻게 해야 합니까?
찾았다.
$env:UserName
또, 다음과 같은 것도 있습니다.
$env:UserDomain
$env:ComputerName
Windows 에서는, 다음의 조작이 가능합니다.
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
저는 주어진 답을 요약하고 비교하는 것이 중요하다고 생각했습니다.
환경변수에 액세스하려면 다음 절차를 따릅니다.
(스위치/스위치/스위치 옵션)
[Environment]::UserName
-- @ThomasBratt$env:username
-- @Eoinwhoami
-- @galaktor
Windows 액세스 토큰에 액세스 하는 경우는, 다음의 순서에 따릅니다.
(신뢰성이 높은 옵션)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
@MarkSeemann
로그인한 사용자의 이름을 원하는 경우
(PowerShell 인스턴스를 실행하는 사용자의 이름이 아닌)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
-- 이 다른 포럼의 @TwonOfAn
비교
@Mark Seemann의 답변에 대한 Kevin Panko의 코멘트는 다음 카테고리 중 하나를 선택하는 것이다.
[Windows 액세스 토큰 접근법]이 가장 안전한 답입니다.$env:유저가 USERNAME을 변경할 수 있습니다만, 그렇게 해도 속지 않습니다.
즉, 환경 변수 옵션은 보다 간결하고 윈도우즈 액세스 토큰 옵션은 보다 신뢰할 수 있습니다.
C# 어플리케이션에서 실행하던 PowerShell 스크립트에서 @Mark Seemann의 Windows 액세스 토큰 접근 방식을 가장하여 사용해야 했습니다.
C# 어플리케이션은 사용자 계정으로 실행되며 PowerShell 스크립트를 서비스 계정으로 실행합니다.C#에서 PowerShell 스크립트를 실행하는 방법에 제한이 있기 때문에 PowerShell 인스턴스는 서비스 계정 사용자로 실행되더라도 사용자 계정의 환경 변수를 사용합니다.
이 설정에서는 환경 변수 옵션이 내 계정 이름을 반환하고 윈도우즈 액세스 토큰 옵션은 서비스 계정 이름(원하는 이름)을 반환하며 로그인 사용자 옵션은 내 계정 이름을 반환합니다.
테스트
또한 옵션을 직접 비교하려면 다른 사용자로 스크립트를 실행하는 데 사용할 수 있는 스크립트를 다음에 제시합니다.Get-Credential cmdlet을 사용하여 credential 개체를 가져온 다음 이 스크립트를 다른 사용자로 실행하고 credential 개체를 인수 1로 실행하며 credential 개체를 인수 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"
할 수 .noprofile
이렇게)
Start-Process -Credential $cred -FilePath 'powershell.exe' -ArgumentList '-noprofile','-Command',"$script"
$env:username
가장 쉬운 방법
woami 명령어를 삽입하고 싶습니다. 기본적으로 이 명령어는 다음과 같은 명령어를 사용할 수 있습니다.%USERDOMAIN%\%USERNAME%
다른 답변에 제시된 바와 같이
Write-Host "current user:"
Write-Host $(whoami)
[Environment]::UserName
사용자 이름만 반환합니다.예: bob [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
는, 필요에 따라서 도메인 앞에 유저명을 반환합니다.예: SOME WHERNICE\bob
PowerShell Core(일명 v6)가 출시되어 크로스 플랫폼 스크립트를 작성할 수 있게 되었기 때문에 이 답변의 대부분은 Windows 이외에서는 동작하지 않습니다.
[Environment]::UserName
플랫폼 검출 및 특수 케이스를 코드에 추가하지 않으려면 PowerShell Core에서 지원되는 모든 플랫폼에서 현재 사용자 이름을 얻는 가장 좋은 방법입니다.
사용한 적이 있다$env:username
과거에는 환경변수이기 때문에 사용자가 변경할 수 있으므로 현재 사용자의 사용자 이름을 얻으려면 신뢰하지 말아야 한다고 동료가 지적했습니다.
Mark Seemann의 답변에 찬성합니다.[시스템]보안.주요한.Windows Identity ]:: GetCurrent().이름.
하지만 난 허락받지 않았어.마크의 답변으로 사용자 이름만 필요한 경우, 내 시스템에서 사용자 이름이 반환되기 때문에 해석해야 할 수 있습니다.hostname\username
도메인 계정을 가진 도메인에 가입된 머신에서는 반환됩니다.domain\username
.
나는 사용하지 않을 것이다.whoami.exe
모든 버전의 Windows 에는 없고, 다른 바이너리에 대한 호출이기 때문에 보안 팀에 따라서는 문제가 발생할 수 있습니다.
다른 사람의 작품을 바탕으로 하고 있습니다.
[String] ${stUserDomain},[String] ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
두 번째 사용자 이름은 복사하여 붙여넣는 경우에만 표시용입니다.
Add-Type 기반의 예는 보이지 않습니다.다음은 getUserName을 advapi32.dll에서 직접 사용하는 방법입니다.
$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()
사용자가 로그인한 경우에도 사용자 이름 속성이 Win32_Computer System에 데이터가 없는 경우가 있습니다.나에게 효과가 있는 것은 quser를 사용하여 출력을 해석하는 것입니다.완벽하진 않지만, 효과가 있어요.예:
$quserdata = @()
$quserdata = quser
$userid = ($quserdata[1] -split ' ')[1]
$userid
주의: 로그인한 사용자로 실행되면 quser는 출력에 '>' 기호를 추가합니다.그런 다음 이 기호를 삭제해야 하지만 대부분 이 기호는 로그인한 계정이 아닌 시스템 또는 다른 계정으로 코드를 실행할 때 필요합니다.
배치에 익숙하신 분은
$user=$(cmd.exe /c echo %username%)
기본적으로 "echo %username%"만 있는 배치 파일이 있는 경우 얻을 수 있는 출력을 훔칩니다.
가장 사용하기 쉬운 것은 cd $home\데스크톱 \
현재 사용자 데스크톱으로 이동합니다.
이 경우 스크립트를 사용하여 경로를 변경할 수 있도록 사용자 이름을 취득해야 했습니다(예: c:\users\%username%).사용자 데스크톱 경로를 변경하여 스크립트를 시작해야 했습니다.get-location 애플릿을 사용하여 위와 다른 곳에서 도움을 받아 이를 수행할 수 있었습니다.
다른 방법이 있을 수도 있고, 더 나은 방법이 있을 수도 있지만, 저는 이 방법이 효과가 있었습니다.
$Path = 위치 가져오기
설정 장소 $Path\데스크탑
이 경우 스크립트를 사용하여 경로를 변경할 수 있도록 사용자 이름을 가져와야 했습니다. c:\users\%username%\
사용자 데스크톱 경로를 변경하여 스크립트를 시작해야 했습니다.get-location 애플릿을 사용하여 위와 다른 곳에서 도움을 받아 이를 수행할 수 있었습니다.
다른 방법이 있을 수도 있고, 더 나은 방법이 있을 수도 있지만, 저는 이 방법이 효과가 있었습니다.
$Path = Get-Location
Set-Location $Path\Desktop
언급URL : https://stackoverflow.com/questions/2085744/how-do-i-get-the-current-username-in-windows-powershell
'UFO ET IT' 카테고리의 다른 글
배치 파일의 앳 기호(@)는 무엇이며 어떤 역할을 합니까? (0) | 2023.04.08 |
---|---|
SQL에서 테이블의 스키마 이름 변경 (0) | 2023.04.08 |
vim — 파일에서 현재 버퍼로 줄 범위를 읽는 방법 (0) | 2021.01.17 |
함수 프로토 타입을 C로 선언해야합니까? (0) | 2021.01.17 |
홈 페이지로 리디렉션하는 방법 (0) | 2021.01.17 |