¿Cómo obtengo el nombre de usuario actual en Windows PowerShell?
¿Cómo obtengo el nombre de usuario actual en Windows PowerShell?
Respuestas:
Lo encontré:
$env:UserName
También hay:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:USERNAME
puede ser alterada por el usuario, pero esto no se dejará engañar al hacerlo.
Pensé que sería valioso resumir y comparar las respuestas dadas.
(opción más fácil / más corta / memorable)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktor(opción más confiable)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @MarkSeemann(en lugar del nombre del usuario que ejecuta la instancia de PowerShell)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- @TwonOfAn en este otro foroEl comentario de @Kevin Panko sobre la respuesta de @Mark Seemann trata de elegir una de las categorías sobre la otra:
[El enfoque de token de acceso de Windows] es la respuesta más segura, porque $ env: USERNAME puede ser alterado por el usuario, pero esto no se dejará engañar.
En resumen, la opción de variable de entorno es más sucinta, y la opción de token de acceso de Windows es más confiable.
Tuve que usar el enfoque de token de acceso de Windows de @Mark Seemann en un script de PowerShell que estaba ejecutando desde una aplicación C # con suplantación.
La aplicación C # se ejecuta con mi cuenta de usuario y ejecuta el script de PowerShell como una cuenta de servicio. Debido a una limitación en la forma en que ejecuto el script de PowerShell desde C #, la instancia de PowerShell usa las variables de entorno de mi cuenta de usuario, aunque se ejecuta como el usuario de la cuenta de servicio.
En esta configuración, las opciones de la variable de entorno devuelven el nombre de mi cuenta, y la opción de token de acceso de Windows devuelve el nombre de la cuenta de servicio (que es lo que quería), y la opción de usuario conectado devuelve el nombre de mi cuenta.
Además, si desea comparar las opciones usted mismo, aquí hay un script que puede usar para ejecutar un script como otro usuario. Debe usar el cmdlet Get-Credential para obtener un objeto de credencial y luego ejecutar este script con el script para ejecutarlo como otro usuario como argumento 1 y el 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
Contenido del 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
es la mejor opción, ya que funciona multiplataforma. whoami
Parece que también funciona, pero depende de la whoami
herramienta que esté disponible en la plataforma.
$env:USERNAME
produce a SYSTEM
menos que lo ejecute como administrador, mientras que [Environment]::UserName]
produce mi nombre de usuario de cualquier manera.
Get-WmiObject
método ya no funciona en pwsh. Incluso trató de importar el módulo de compatibilidad y el Microsoft.PowerShell.Management
que tiene el cmdlet. ¿Alguna idea de lo que está pasando?
Me gustaría agregar el comando whoami , que básicamente es un buen alias para hacer %USERDOMAIN%\%USERNAME%
lo propuesto en otras respuestas.
Write-Host "current user:"
Write-Host $(whoami)
$env:USERNAME
puede ser alterado por el usuario, pero esto no se dejará engañar haciendo eso.
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)
whoami
Es un ejecutable. No se puede eliminar de PowerShell. Potencialmente podría eliminarse de Windows, pero todavía está allí a partir de un servidor que no sea Nano Windows 2012.
[Environment]::UserName
devuelve solo el nombre de usuario. Por ejemplo, bob
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
devuelve el nombre de usuario, prefijado por su dominio cuando corresponda. Ej. ALGUNA HERENCIA \ bob
He usado $env:username
en el pasado, pero un colega señaló que es una variable de entorno y que el usuario puede cambiarlo y, por lo tanto, si realmente desea obtener el nombre de usuario del usuario actual, no debe confiar en él.
Votaría la respuesta de Mark Seemann: [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Name
Pero no se me permite. Con la respuesta de Mark, si solo necesita el nombre de usuario, es posible que tenga que analizarlo ya que en mi sistema, regresa hostname\username
y en máquinas unidas a un dominio con cuentas de dominio, lo devolverá domain\username
.
No lo usaría, whoami.exe
ya que no está presente en todas las versiones de Windows, y es una llamada a otro binario y puede dar algunos ajustes a los equipos de seguridad.
[Environment]::UserName
es menos tipeado, independiente $env:username
y multiplataforma: consulte pastebin.com/GsfR6Hrp
Ahora que se ha lanzado PowerShell Core (también conocido como v6), y las personas pueden querer escribir scripts multiplataforma, muchas de las respuestas aquí no funcionarán en otra cosa que no sea Windows.
[Environment]::UserName
parece ser la mejor manera de obtener el nombre de usuario actual en todas las plataformas compatibles con PowerShell Core si no desea agregar detección de plataforma y carcasa especial a su código.
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
El segundo nombre de usuario es solo para mostrar si lo copia y lo pega.
No vi ningún ejemplo basado en Add-Type . Aquí hay uno que usa GetUserName directamente desde 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
, y UNLEN
es 256), ignora cualquier error que pueda ser devuelto por GetUserName (a través de conserva GetLastError, un buen punto), no limpia el búfer de cadena; y probablemente algunos otros. Y como otros dijeron, también faltan comentarios.
Me parece más fácil de usar: cd $ home \ Desktop \
En mi caso, necesitaba recuperar el nombre de usuario para permitir que el script cambiara la ruta, es decir. c: \ users \% username%. Necesitaba comenzar el script cambiando la ruta al escritorio de los usuarios. Pude hacer esto, con la ayuda de arriba y de otros lugares, usando el applet get-location.
Es posible que tenga otra forma, o incluso mejor, de hacerlo, pero esto funcionó para mí:
$ Path = Get-Location
Establecer ubicación $ Ruta \ Escritorio
Si está acostumbrado a lotes, puede llamar
$user=$(cmd.exe /c echo %username%)
Básicamente, esto roba el resultado de lo que obtendría si tuviera un archivo por lotes con solo "echo% username%".
$(...)
superfluo: $a = cmd.exe /c echo %username%
funciona, b) no es portátil, c) en realidad no responde la pregunta de cómo hacerlo en PowerShell, responde cómo hacerlo en dos, y es mejor darle a un hombre una caña de pescar que darle un pez, por ejemplo 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}
En mi caso, necesitaba recuperar el nombre de usuario para permitir que el script cambiara la ruta, es decir. c:\users\%username%\
. Necesitaba comenzar el script cambiando la ruta al escritorio de los usuarios. Pude hacer esto, con la ayuda de arriba y de otros lugares, usando el applet get-location .
Es posible que tenga otra forma, o incluso mejor, de hacerlo, pero esto funcionó para mí:
$Path = Get-Location
Set-Location $Path\Desktop
Set-Location Desktop
. ( Get-Location
simplemente devuelve la ubicación actual, que está implícita para a Set-Location
con una ruta relativa.)
$env:username
recuperar el nombre de usuario de la variable de entorno correspondiente.