Come ottengo il nome utente corrente in Windows PowerShell?


Risposte:


398

L'ho trovato:

$env:UserName

C'è anche:

$env:UserDomain
$env:ComputerName

10
Un'alternativa rapida e sporca sarebbe quella $env:usernamedi recuperare il nome utente dalla corrispondente variabile d'ambiente.
Guillermooo,

7
Penso che $ env: username e [Environment] :: UserName puntino entrambi alla stessa cosa.
Cefa

16
Grazie per essere tornato per rispondere alla tua domanda. Niente di più frustrante quando qualcuno capisce da sé la risposta e risponde semplicemente: "Non importa, capito!"
Matt DiTrolio,

6
@MattDiTrolio Questo è certamente frustrante, ma pensi che non ci sia nulla di più frustrante di così ?!
Codice Jockey

5
@CodeJockey Niente. Non nella storia di sempre. :)
Matt DiTrolio,

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

16
Questa è la risposta più sicura perché $env:USERNAMEpuò essere modificata dall'utente, ma ciò non verrà ingannato nel farlo.
Kevin Panko,

6
@KevinPanko Vero, ma al punto che non puoi fidarti del tuo utente, ci sono altre domande più filosofiche che devono essere poste. ;-)
jpaugh

4
Questo metodo include il nome di dominio e il nome utente. Sicuramente vantaggioso se hai più domini in gioco.
Ryan Gates,

Funziona come previsto. Testato per la prenotazione dell'indirizzo URL.
Marek Bar,

Inoltre, sembra funzionare anche in PowerShell 6, il che significa che è compatibile multipiattaforma (.Net Standard). Ho pensato che valesse la pena menzionarlo da quando l'ho messo in discussione quando ho visto lo spazio dei nomi.
Deadlydog,

120

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

Se si desidera accedere alla variabile di ambiente :

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

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

Se si desidera accedere al token di accesso di Windows :

(opzione più affidabile)

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

Se si desidera il nome dell'utente che ha effettuato l'accesso

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

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

Confronto

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

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

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

Ho dovuto usare l'approccio token di accesso a Windows di @Mark Seemann in uno script di PowerShell che stavo eseguendo da un'applicazione C # con imitazione.

L'applicazione C # viene eseguita con il mio account utente ed esegue 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 della variabile di ambiente restituiscono il nome del mio account e l'opzione del token di accesso a Windows restituisce il nome dell'account del servizio (che è quello che volevo) e l'opzione dell'utente che ha effettuato l'accesso restituisce il nome del mio account.


analisi

Inoltre, se vuoi confrontare tu stesso le opzioni, ecco uno script che puoi usare 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 eseguire come altro utente come argomento 1 e l'oggetto credenziale 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"

Per PowerShell 6 su Mac OS X e Linux, [Environment]::UserNameè l'opzione migliore, poiché funziona su più piattaforme. whoamisembra funzionare anche, ma dipende dallo whoamistrumento disponibile sulla piattaforma.
Florian Feldhaus,

Per Powershell 6 su Windows, $env:USERNAMEproduce SYSTEMse non corro come amministratore, mentre [Environment]::UserName]cede il mio nome utente in entrambi i casi.
kfsone,

1
Sembra che il Get-WmiObjectmetodo non funzioni più in pwsh. Ho anche provato a importare il modulo di compatibilità e quello Microsoft.PowerShell.Managementche ha il cmdlet. Qualche idea di cosa sta succedendo?
not2qubit

Corretta. È stato confuso da Get-CimInstance un po 'di tempo fa per motivi di prestazioni ... e CIM deve essere utilizzato su WMI in v6 per motivi di compatibilità incrociata. Se vedi un comando con GWMI, controlla invece di poter eseguire GCIM.
Hicsy,

105

$env:username è il modo più semplice


Puoi assegnarlo in questo modo e creare directory e cosa no.
Droogans,

51

Vorrei lanciare il comando whoami , che in pratica è un simpatico alias per fare %USERDOMAIN%\%USERNAME%come proposto in altre risposte.

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

funziona per me su PS versione 2. Stai dicendo che è stato lasciato cadere su PS3? C: \> powershell Windows PowerShell Copyright (C) 2009 Microsoft Corporation. Tutti i diritti riservati. PS C: \> whoami mydomain \
myusername

2
$env:USERNAMEpuò essere modificato dall'utente, ma ciò non verrà ingannato nel farlo.
Kevin Panko,

3
whoami vince per uso interattivo. È abbastanza breve da ricordare come digitarlo senza consultare SO :-)
Iain Samuel McLean Elder,

Non è una cosa su Nano Server. Non usarlo negli script, fai la cosa giusta ( [System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
Ancora un altro utente il

whoamiè un eseguibile. Non può essere rimosso da PowerShell. Potrebbe essere potenzialmente rimosso da Windows, ma è ancora lì a partire da Windows Server non Nano 2012.
jpmc26

37

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


12

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

Voterei 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, potresti dover analizzarlo poiché sul mio sistema, ritorna hostname\usernamee su macchine unite al dominio con account di dominio tornerà domain\username.

Non lo userei whoami.exedal momento che non è presente su tutte le versioni di Windows, è una chiamata a un altro binario e può fornire alcuni adattamenti dei team di sicurezza.


1
Dal momento che l'OP ha chiesto informazioni su Windows-Powershell, è valido, ma [Environment]::UserNameè meno digitato, indipendente $env:usernamee multipiattaforma: vedi pastebin.com/GsfR6Hrp
kfsone

12

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 altro che 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 il case speciale al codice.


10

Basandosi sul lavoro di altri qui:

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

1
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

$username

Il secondo nome utente è solo a scopo di visualizzazione solo se lo si copia e si incolla.


$ fullname = Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username $ username = $ fullname.Replace ("DOMAIN \", "") $ username
clayton.nichols

-1

Non ho visto alcun esempio basato su Add-Type . Eccone uno che utilizza GetUserName direttamente da 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()

1
Spiegare cosa sta facendo questo codice e perché sarebbe più utile di uno dei metodi più brevi.
Benjamin Hubbard,

@BenjaminHubbard La domanda non richiede il metodo più breve, ma chiede come realizzare l'impresa con PowerShell. Questo fa il trucco in modo diverso rispetto agli altri esempi chiamando la funzione all'interno della dll e usando il metodo Add-Type per accedere a .NET.
Knuckle-Dragger,

1
Anche se questo è un romanzo blocco di codice, sarebbe bello se sapessi cosa diavolo stava facendo. Puoi annotarlo con commenti, forse? Grazie!
jpaugh

1
Volevo quasi votare, poiché ho visto il merito della proposta. Tuttavia il codice presenta alcuni difetti: introduce un nuovo spazio dei nomi, utilizza una costante magica (64) il cui valore non è quello che il medico ha prescritto (dovrebbe essere UNLEN+1, ed UNLENè 256), ignora qualsiasi errore che potrebbe essere restituito da GetUserName (tramite conserva GetLastError, un buon punto), non pulisce il buffer delle stringhe; e probabilmente alcuni altri. E come altri hanno detto, anche i commenti mancano molto.
AntoineL,

-1

Trovo più facile da usare: cd $ home \ Desktop \

ti porterà sul desktop dell'utente corrente

Nel mio caso, dovevo recuperare il nome utente per consentire allo script di modificare il percorso, ad es. C: \ Users \% username%. Avevo bisogno di avviare lo script modificando il percorso sul desktop degli utenti. Sono stato in grado di farlo, con l'aiuto dall'alto e altrove, utilizzando l'applet get-location.

Potresti avere un altro modo, o anche migliore, per farlo, ma questo ha funzionato per me:

$ Path = Get-Location

Set-Location $ Path \ Desktop


Fare ipotesi basate sulla home directory è destinato a funzionare solo in condizioni molto specifiche.
Raúl Salinas-Monteagudo,

Se stai lavorando in un terminale PowerShell e vuoi scoprire rapidamente quale utente sei, digitare "ls ~" dovrebbe fare il trucco. Come il poster sopra, potrebbero esserci delle eccezioni, e questo sicuramente non è buono per gli script, quindi usa l'esempio di Edouard Poor in quel caso.
MrBerta

-2

Se sei abituato al batch, puoi chiamare

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

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


1
Sto effettuando il downvoting perché: a) Tu sei $(...)superfluo: $a = cmd.exe /c echo %username%funziona, b) non è portatile, c) in realtà non risponde alla domanda su come farlo in PowerShell, risponde come farlo in Dos, ed è meglio dare a un uomo una canna da pesca piuttosto che dargli un pesce, ad es powershell puts environment variables into $env, so %username% = $env:username.
kfsone

-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}

$ contents = get-content "cm.txt" ---- $ count = 0 ----- foreach ($ line in $ count) ---- {$ count = $ count + 1} ---- write -host "hai queste molte righe:" $ count
ammy

1. $ a = $ com1, $ com2 ------ write-host "inserisci cm name" ---- $ c = readhost ----- write-host $ a [$ c-1] .username , write-host $ a [$ c-1] .password
ammy

$ com1 = oggetto nuovo oggetto PS ----- $ com1 = $ com1 | add-member noteproperty -name username -value 2016
ammy

1
c'è un motivo per cui aggiungi codice come commenti alla tua risposta?
aldr

1
perché non modifichi la tua risposta e aggiungi il codice invece di suddividerlo in commenti come quello in cui nessuno lo capirà?
aldr,

-4

Nel mio caso, dovevo recuperare il nome utente per consentire allo script di modificare il percorso, ad es. c:\users\%username%\. Avevo bisogno di avviare lo script modificando il percorso sul desktop degli utenti. Sono stato in grado di farlo, con l'aiuto dall'alto e altrove, utilizzando get-location applet .

Potresti avere un altro modo, o anche migliore, per farlo, ma questo ha funzionato per me:

$Path = Get-Location

Set-Location $Path\Desktop

1
Benvenuto in Stack Overflow ! Questo equivale a Set-Location Desktop. ( Get-Locationrestituisce semplicemente la posizione corrente, che è implicita per a Set-Locationcon un percorso relativo.)
jpaugh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.