UFO ET IT

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

ufoet 2023. 4. 8. 11:55
반응형

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

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

찾았다.

$env:UserName

또, 다음과 같은 것도 있습니다.

$env:UserDomain
$env:ComputerName

Windows 에서는, 다음의 조작이 가능합니다.

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

저는 주어진 답을 요약하고 비교하는 것이 중요하다고 생각했습니다.

환경변수에 액세스하려면 다음 절차를 따릅니다.

(스위치/스위치/스위치 옵션)

  • [Environment]::UserName-- @ThomasBratt
  • $env:username-- @Eoin
  • whoami-- @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

반응형