Domanda Come ottenere il nome utente corrente in Windows PowerShell?


Come ottenere il nome utente corrente in Windows PowerShell?


216
2018-01-18 11:50


origine


risposte:


Trovato:

$env:UserName

C'è anche:

$env:UserDomain
$env:ComputerName

274
2018-01-18 11:52



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

126
2018-01-18 11:54



$env:username è il modo più semplice


97
2017-10-14 12:59



Ho pensato che sarebbe stato utile riassumere e confrontare le risposte fornite.

Se si desidera accedere a variabile d'ambiente:

(opzione più facile / più breve / memorabile)

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

Se si desidera accedere a token di accesso a Windows:

(opzione più affidabile)

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

Se si desidera il nome dell'utente connesso

(anziché il nome dell'utente che esegue l'istanza di PowerShell)

  • $(Get-WMIObject -class Win32_ComputerSystem | select username).username - @TwonOfAn on questo altro forum

Confronto

@Kevin Il commento di Panko sulla risposta di @Mark Seemann riguarda la scelta di una delle categorie rispetto all'altra:

[L'approccio token di accesso a Windows] è la risposta più sicura perché $ env: USERNAME può essere modificato dall'utente, ma ciò non si farà ingannare.

In breve, l'opzione variabile di ambiente è più succinta e l'opzione token di accesso a Windows è più affidabile.

Ho dovuto usare l'approccio del token di accesso a Windows di @Mark Seemann in uno script PowerShell che stavo eseguendo da un'applicazione C # con impersonificazione. L'applicazione C # viene eseguita con il mio account utente e viene eseguito lo script PowerShell come account di servizio. A causa di una limitazione del modo in cui eseguo lo script PowerShell da C #, l'istanza di PowerShell utilizza le variabili di ambiente del mio account utente, anche se viene eseguita come utente dell'account di servizio. In questa configurazione, le opzioni di variabile di ambiente restituiscono il nome dell'account e l'opzione di accesso al token di Windows restituisce il nome dell'account di servizio (che è quello che volevo) e l'opzione utente connesso restituisce il nome dell'account.


analisi

Inoltre, se si desidera confrontare le opzioni da soli, qui è uno script che è possibile utilizzare per eseguire uno script come un altro utente. È necessario utilizzare il cmdlet Get-Credential per ottenere un oggetto credenziale, quindi eseguire questo script con lo script per eseguirlo come un altro utente come argomento 1 e l'oggetto credential come argomento 2.

Uso:

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

Contenuto dello 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"

71
2018-04-29 21:49



Mi piacerebbe buttare nel chi sono comando, che in fondo è un bel alias per fare %USERDOMAIN%\%USERNAME% come proposto in altre risposte.

Write-Host "current user:"
Write-Host $(whoami)

44
2017-11-14 09:08



[Environment]::UserName restituisce solo il nome utente. Per esempio. peso [System.Security.Principal.WindowsIdentity]::GetCurrent().Name restituisce il nome utente, preceduto dal suo dominio, ove appropriato. Per esempio. SOMEWHERENICE \ bob


31
2017-07-14 12:19



Ho usato $ env: username in passato, ma un collega ha sottolineato, è una variabile di ambiente e può essere modificata dall'utente e quindi, se si vuole veramente ottenere il nome utente dell'utente corrente, non ci si deve fidare di esso.

Eviterei la risposta di Mark Seemann:

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

ma non mi è permesso. Con la risposta di Mark, se hai bisogno solo del nome utente, potrebbe essere necessario analizzarlo dal mio sistema, restituisce nomehost \ nome utente e su macchine con dominio di dominio con account di dominio restituirà dominio \ nome utente.

Non userei whoami.exe dal momento che non è presente su tutte le versioni di Windows e si tratta di una chiamata a un altro binario e potrebbe fornire alcuni adattamenti per i team di sicurezza.


6
2018-01-24 17:21



Basandoci sul lavoro degli altri qui:

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

E grazie per le informazioni perché mi piace ottenere i dati semplicemente e da una fonte autorevole.


4
2017-08-04 16:42



Ora che Powershell Core (noto anche come v6) è stato rilasciato, e le persone potrebbero voler scrivere script multipiattaforma, molte delle risposte qui non funzioneranno su qualcosa di diverso da Windows.

[Environment]::UserName sembra essere il modo migliore per ottenere il nome utente corrente su tutte le piattaforme supportate da Powershell Core se non si desidera aggiungere il rilevamento della piattaforma e l'involucro speciale al codice.


1
2018-03-15 20:37



Se sei abituato a batch, puoi chiamare

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

Questo in pratica ruba l'output da ciò che otterresti se avessi un file batch con solo "echo% username%".


0
2017-07-06 21:37