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:USERNAME
può 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. whoami
sembra funzionare anche, ma dipende dallo whoami
strumento disponibile sulla piattaforma.
$env:USERNAME
produce SYSTEM
se non corro come amministratore, mentre [Environment]::UserName]
cede il mio nome utente in entrambi i casi.
Get-WmiObject
metodo non funzioni più in pwsh. Ho anche provato a importare il modulo di compatibilità e quello Microsoft.PowerShell.Management
che 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:USERNAME
può 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]::UserName
restituisce 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:username
in 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\username
e su macchine unite al dominio con account di dominio tornerà domain\username
.
Non lo userei whoami.exe
dal 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:username
e 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-Location
restituisce semplicemente la posizione corrente, che è implicita per a Set-Location
con un percorso relativo.)
$env:username
di recuperare il nome utente dalla corrispondente variabile d'ambiente.