Como obtenho o nome de usuário atual no Windows PowerShell?

324

Como obtenho o nome de usuário atual no Windows PowerShell?

Thomas Bratt
fonte

Respostas:

398

Eu encontrei:

$env:UserName

Há também:

$env:UserDomain
$env:ComputerName
Thomas Bratt
fonte
10
Uma alternativa rápida e suja seria $env:usernamerecuperar o nome de usuário da variável de ambiente correspondente.
precisa
7
Eu acho que $ env: nome de usuário e [Environment] :: UserName estão apontando para a mesma coisa.
Cefas
16
Obrigado por voltar para responder à sua própria pergunta. Nada mais frustrante quando alguém descobre a resposta e simplesmente responde: "Não importa, entendi!"
Matt DiTrolio
6
@MattDiTrolio Isso certamente é frustrante, mas você acha que não há nada mais frustrante do que isso ?!
Code Jockey
5
@CodeJockey Nothing. Não na história de sempre. :)
Matt DiTrolio
180
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
Mark Seemann
fonte
16
Esta é a resposta mais segura, pois $env:USERNAMEpode ser alterada pelo usuário, mas isso não será enganado ao fazer isso.
precisa
6
@KevinPanko True, mas no momento em que você não pode confiar no seu usuário, há outras perguntas mais filosóficas que precisam ser feitas. ;-)
jpaugh 18/01/16
4
Este método inclui o nome de domínio e o nome de usuário. Definitivamente benéfico se você tiver vários domínios em jogo.
Ryan Gates
Funciona como esperado. Testado para reserva de endereço de URL.
Marek Bar
Além disso, parece funcionar também no PowerShell 6, o que significa que é compatível com várias plataformas (.Net Standard). Achei que valia a pena mencionar, já que o questionei quando vi o espaço para nome.
deadlydog
120

Eu pensei que seria valioso resumir e comparar as respostas dadas.

Se você deseja acessar a variável de ambiente :

(opção mais fácil / mais curta / memorável)

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

Se você deseja acessar o token de acesso do Windows :

(opção mais confiável)

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

Se você deseja o nome do usuário conectado

(em vez do nome do usuário que está executando a instância do PowerShell)

  • $(Get-WMIObject -class Win32_ComputerSystem | select username).username- @TwonOfAn neste outro fórum

Comparação

O comentário de @Kevin Panko na resposta de @Mark Seemann trata da escolha de uma das categorias em detrimento da outra:

[A abordagem do token de acesso do Windows] é a resposta mais segura, porque $ env: USERNAME pode ser alterado pelo usuário, mas isso não será enganado.

Em resumo, a opção de variável de ambiente é mais sucinta e a opção de token de acesso do Windows é mais confiável.

Eu tive que usar a abordagem de token de acesso do Windows Seemark no Windows PowerShell em um script do PowerShell que eu estava executando em um aplicativo C # com representação.

O aplicativo C # é executado com minha conta de usuário e executa o script do PowerShell como uma conta de serviço. Devido a uma limitação da maneira como estou executando o script do PowerShell a partir do C #, a instância do PowerShell usa as variáveis ​​de ambiente da minha conta de usuário, mesmo que seja executada como usuário da conta de serviço.

Nesta configuração, as opções da variável de ambiente retornam o nome da minha conta e a opção de token de acesso do Windows retorna o nome da conta de serviço (que era o que eu queria), e a opção de usuário conectado retorna o nome da minha conta.


Teste

Além disso, se você quiser comparar as opções, aqui está um script que você pode usar para executar um script como outro usuário. Você precisa usar o cmdlet Get-Credential para obter um objeto de credencial e, em seguida, executar esse script com o script para executar como outro usuário como argumento 1 e o objeto de credencial como argumento 2.

Uso:

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

Conteúdo do script 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"
alexanderbird
fonte
Para o PowerShell 6 no Mac OS X e Linux, [Environment]::UserNameé a melhor opção, pois funciona em várias plataformas. whoamitambém parece funcionar, mas depende da whoamiferramenta estar disponível na plataforma.
Florian Feldhaus
Para o Powershell 6 no Windows, $env:USERNAMEproduz , a SYSTEMmenos que eu corra como administrador, enquanto [Environment]::UserName]produz meu nome de usuário de qualquer maneira.
Kfsone
1
Parece que o Get-WmiObjectmétodo não funciona mais no pwsh. Até tentou importar o módulo de compatibilidade e o Microsoft.PowerShell.Managementque possui o cmdlet. Alguma idéia do que está acontecendo?
Not2qubit
Corrigir. Ele foi afetado há muito tempo pelo Get-CimInstance por motivos de desempenho ... e o CIM deve ser usado sobre o WMI na v6 por motivos de compatibilidade cruzada. Se você vir um comando com GWMI, verifique se é possível executar o GCIM.
Hicsy 4/09/19
105

$env:username é a maneira mais fácil

Eoin
fonte
Você pode atribuí-lo dessa maneira e criar diretórios e quais não.
Droogans
51

Eu gostaria de lançar o comando whoami , que basicamente é um bom alias para fazer %USERDOMAIN%\%USERNAME%como proposto em outras respostas.

Write-Host "current user:"
Write-Host $(whoami)
galaktor
fonte
funciona para mim no PS versão 2. Você está dizendo que foi lançado no PS3? C: \> PowerShell Direitos Autorais do Windows PowerShell (C) 2009 Microsoft Corporation. Todos os direitos reservados. PS C: \> whoami mydomain \ myusername
galaktor
2
$env:USERNAMEpode ser alterado pelo usuário, mas isso não será enganado ao fazer isso.
precisa
3
whoami vence por uso interativo. É curto o suficiente para que eu possa me lembrar de como escrevê-lo sem consultar SO :-)
Iain Samuel McLean Elder
Nada no Nano Server. Não o use em scripts, faça a coisa correta ( [System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
Outro usuário
whoamié um executável. Não pode ser removido do PowerShell. Ele poderia ser removido do Windows, mas ele ainda está lá como de não-Nano Windows Server 2012.
jpmc26
37

[Environment]::UserNameretorna apenas o nome do usuário. Por exemplo, bob [System.Security.Principal.WindowsIdentity]::GetCurrent().Name retorna o nome do usuário, prefixado por seu domínio, quando apropriado. Por exemplo, ALGUM LUGAR ONDE

WaffleSouffle
fonte
12

Eu usei $env:usernameno passado, mas um colega apontou que é uma variável de ambiente e pode ser alterada pelo usuário e, portanto, se você realmente deseja obter o nome de usuário do usuário atual, não deve confiar nela.

Eu recomendo a resposta de Mark Seemann: [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Name

Mas eu não tenho permissão. Com a resposta de Mark, se você precisar apenas do nome de usuário, talvez seja necessário analisá-lo, pois no meu sistema ele retorna hostname\usernamee em máquinas ingressadas no domínio com contas de domínio ele retornará domain\username.

Eu não usaria, whoami.exepois ele não está presente em todas as versões do Windows, e é uma chamada para outro binário e pode dar alguns ajustes às equipes de segurança.

Dave Hull
fonte
1
Como o OP perguntou sobre o Windows-Powershell, isso é válido, mas [Environment]::UserNameé menos digitado, independente $env:usernamee multiplataforma: consulte pastebin.com/GsfR6Hrp
kfsone
12

Agora que o PowerShell Core (também conhecido como v6) foi lançado e as pessoas podem querer escrever scripts entre plataformas, muitas das respostas aqui não funcionarão em nada além do Windows.

[Environment]::UserName parece ser a melhor maneira de obter o nome de usuário atual em todas as plataformas suportadas pelo PowerShell Core, se você não deseja adicionar detecção de plataforma e revestimento especial ao seu código.

Edouard Poor
fonte
10

Apenas desenvolvendo o trabalho de outras pessoas aqui:

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
Stef
fonte
1
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

$username

O segundo nome de usuário é apenas para exibição, se você o copiar e colar.

clayton.nichols
fonte
$ fullname = Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty nome de usuário $ username = $ fullname.Replace ( "DOMÍNIO \", "") $ username
clayton.nichols
-1

Não vi nenhum exemplo baseado em tipo de adição. Aqui está um usando o GetUserName diretamente do 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()
Knuckle-Dragger
fonte
1
Por favor, explique o que esse código está fazendo e por que seria mais útil que um dos métodos mais curtos.
9605 Benjamin Hubbard
@BenjaminHubbard A pergunta não pede o método mais curto, mas sim como realizar o feito com o PowerShell. Isso faz o truque de maneira diferente dos outros exemplos, chamando a função dentro da dll e usando o método Add-Type para acessar o .NET.
Junta Knuckle-Dragger
1
Embora este seja um novo bloco de código, seria ótimo se eu soubesse o que diabos estava fazendo. Você pode anotá-lo com comentários, talvez? Obrigado!
jpaugh
1
Eu quase quis votar, pois vi o mérito da proposta. No entanto, o código possui algumas falhas: introduz um novo espaço para nome, usa uma constante mágica (64) cujo valor não é o que o médico prescreveu (deveria ser UNLEN+1e UNLENé 256), desconsidera qualquer erro que possa ser retornado de GetUserName (por meio de preserva GetLastError, um bom ponto), não limpa o buffer da string; e provavelmente alguns outros. E, como outros disseram, também faltam comentários.
AntoineL #
-1

Acho mais fácil de usar: cd $ home \ Desktop \

levará você à área de trabalho do usuário atual

No meu caso, eu precisava recuperar o nome de usuário para permitir que o script alterasse o caminho, ou seja. c: \ users \% nome de usuário%. Eu precisava iniciar o script alterando o caminho para a área de trabalho dos usuários. Consegui fazer isso, com a ajuda de cima e de outros lugares, usando o applet get-location.

Você pode ter outra maneira, ou ainda melhor, de fazer isso, mas isso funcionou para mim:

$ Path = Get-Location

Set-Location $ Path \ Desktop

Kes tas
fonte
Fazer qualquer suposição com base no diretório inicial é obrigado a funcionar apenas sob condições muito específicas.
Raúl Salinas-Monteagudo
Se você estiver trabalhando em um terminal do PowerShell e quiser descobrir rapidamente qual usuário você é, digitar "ls ~" deve fazer o truque. Como no pôster acima, pode haver exceções, e isso definitivamente não é bom para scripts, então use o exemplo de Edouard Poor nesse caso.
MrBerta
-2

Se você está acostumado ao lote, pode ligar para

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

Isso basicamente rouba a saída do que você obteria se tivesse um arquivo em lotes com apenas "echo% username%".

shaws
fonte
1
Estou com voto negativo porque: a) Você $(...)é supérfluo: $a = cmd.exe /c echo %username%funciona, b) não é portátil, c) na verdade, não responde à pergunta de como fazê-lo no PowerShell, responde como fazê-lo no DOS, e é melhor dar a um homem uma vara de pescar do que dar a ele um peixe, por exemplo powershell puts environment variables into $env, so %username% = $env:username.
Kfsone # 23/18
-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}
ammy
fonte
$ content = get-content "cm.txt" ---- $ count = 0 ----- foreach ($ linha em $ count) ---- {$ count = $ count + 1} ---- write -host "você tem estas muitas linhas:" $ count
ammy
1. $ a = $ com1, $ com2 ------ host de gravação "digite o nome do cm" ---- $ c = readhost ----- host de gravação $ a [$ c-1] .username , write-host $ a [$ c-1] .password
ammy
$ com1 = novo objeto PSobject ----- $ com1 = $ com1 | add-member noteproperty -name username -value 2016
ammy
1
Existe uma razão pela qual você adiciona código como comentários em sua própria resposta?
aldr
1
por que você não edita sua resposta e adiciona o código em vez de dividi-lo em comentários como esse, onde ninguém vai entender?
Alr
-4

No meu caso, eu precisava recuperar o nome de usuário para permitir que o script alterasse o caminho, ou seja. c:\users\%username%\. Eu precisava iniciar o script alterando o caminho para a área de trabalho dos usuários. Consegui fazer isso, com a ajuda de cima e de outros lugares, usando o applet get-location .

Você pode ter outra maneira, ou ainda melhor, de fazer isso, mas isso funcionou para mim:

$Path = Get-Location

Set-Location $Path\Desktop
kjp
fonte
1
Bem-vindo ao Stack Overflow ! Isso é equivalente a Set-Location Desktop. ( Get-LocationApenas retorna o local atual, o que está implícito para um Set-Locationcom um caminho relativo.)
jpaugh