Come ottengo il nome utente corrente in Windows PowerShell?
Come ottengo il nome utente corrente in Windows PowerShell?
Risposte:
L'ho trovato:
$env:UserName
C'è anche:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:USERNAMEpuò essere modificata dall'utente, ma ciò non verrà ingannato nel farlo.
Ho pensato che sarebbe stato utile riassumere e confrontare le risposte fornite.
(opzione più semplice / più breve / memorabile)
[Environment]::UserName - @ThomasBratt$env:username - @Eoinwhoami - @galaktor(opzione più affidabile)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name - @MarkSeemann(anziché il nome dell'utente che esegue l'istanza di PowerShell)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username- @TwonOfAn su questo altro forumIl 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.
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"
[Environment]::UserNameè l'opzione migliore, poiché funziona su più piattaforme. whoamisembra funzionare anche, ma dipende dallo whoamistrumento disponibile sulla piattaforma.
$env:USERNAMEproduce SYSTEMse non corro come amministratore, mentre [Environment]::UserName]cede il mio nome utente in entrambi i casi.
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?
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)
$env:USERNAMEpuò essere modificato dall'utente, ma ciò non verrà ingannato nel farlo.
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
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.
[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
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.
[Environment]::UserNameè meno digitato, indipendente $env:usernamee multipiattaforma: vedi pastebin.com/GsfR6Hrp
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.
$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.
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()
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.
Trovo più facile da usare: cd $ home \ Desktop \
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
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%".
$(...)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.
get-content "cm.txt"write-host "entr file name"
$file = read-host
get-content $file$content = get-content "cm.txt"$content = get-content "cn.txt"
for each ($line in $count)
{write-host $line}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
Set-Location Desktop. ( Get-Locationrestituisce semplicemente la posizione corrente, che è implicita per a Set-Locationcon un percorso relativo.)
$env:usernamedi recuperare il nome utente dalla corrispondente variabile d'ambiente.