windows - started - powershell tutorial



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

  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}

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


Answer #1

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

irá levá-lo para a área de trabalho atual do usuário

No meu caso, eu precisava recuperar o nome de usuário para permitir que o script alterasse o caminho, por exemplo. c: \ users \% username%. Eu precisava iniciar o script alterando o caminho para a área de trabalho dos usuários. Eu era capaz de fazer isso, com ajuda de cima e de outros lugares, usando o applet de obtenção de localização.

Você pode ter outra, ou melhor, maneira de fazê-lo, mas isso funcionou para mim:

$ Path = Get-Location

Set-Location $ Path \ Desktop


Answer #2

Apenas construindo o trabalho dos outros aqui:

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")

Answer #3

Eu encontrei:

$env:UserName

Há também:

$env:UserDomain
$env:ComputerName

Answer #4

Eu não vi nenhum exemplo baseado em Add-Type . Aqui está um usando o GetUserName diretamente de 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()

Answer #5

Eu pensei que seria valioso para 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ê quiser o nome do usuário logado

(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 do @Kevin Panko sobre a resposta do @Mark Seemann trata da escolha de uma das categorias em relação à outra:

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

Em suma, 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 @Mark Seemann em um script do PowerShell que eu estava executando de 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 em C #, a instância do PowerShell usa as variáveis ​​de ambiente da minha conta de usuário, embora seja executada como o usuário da conta de serviço.

Nesta configuração, as opções de 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 é o que eu queria) e a opção de usuário conectado retorna o nome da minha conta.

Testando

Além disso, se você quiser comparar as opções sozinho, 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 ser executado 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"

Answer #6

No meu caso, eu precisava recuperar o nome de usuário para permitir que o script alterasse o caminho, por exemplo. c:\users\%username%\ . Eu precisava iniciar o script alterando o caminho para a área de trabalho dos usuários. Eu era capaz de fazer isso, com ajuda de cima e de outros lugares, usando o applet de obtenção de localização .

Você pode ter outra, ou melhor, maneira de fazê-lo, mas isso funcionou para mim:

$Path = Get-Location

Set-Location $Path\Desktop

Answer #7

Se você está acostumado a lote, você pode ligar

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

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


Answer #8

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


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




scripting