¿Cómo obtengo el nombre de usuario actual en Windows PowerShell?
windows
powershell
scripting
Thomas Bratt
fuente
fuente
$env:username
recuperar el nombre de usuario de la variable de entorno correspondiente.fuente
$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.
Si desea acceder a la variable de entorno :
(opción más fácil / más corta / memorable)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktorSi desea acceder al token de acceso de Windows :
(opción más confiable)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @MarkSeemannSi desea el nombre del usuario conectado
(en lugar del nombre del usuario que ejecuta la instancia de PowerShell)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- @TwonOfAn en este otro foroComparación
El comentario de @Kevin Panko sobre la respuesta de @Mark Seemann trata de elegir una de las categorías sobre la otra:
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.
Pruebas
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:
Contenido del script Run-AsUser.ps1:
fuente
[Environment]::UserName
es la mejor opción, ya que funciona multiplataforma.whoami
Parece que también funciona, pero depende de lawhoami
herramienta que esté disponible en la plataforma.$env:USERNAME
produce aSYSTEM
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 elMicrosoft.PowerShell.Management
que tiene el cmdlet. ¿Alguna idea de lo que está pasando?$env:username
es la forma más fácilfuente
Me gustaría agregar el comando whoami , que básicamente es un buen alias para hacer
%USERDOMAIN%\%USERNAME%
lo propuesto en otras respuestas.fuente
$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 \ bobfuente
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.fuente
[Environment]::UserName
es menos tipeado, independiente$env:username
y multiplataforma: consulte pastebin.com/GsfR6HrpAhora 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.fuente
Basándome en el trabajo de otros aquí:
fuente
$username
El segundo nombre de usuario es solo para mostrar si lo copia y lo pega.
fuente
No vi ningún ejemplo basado en Add-Type . Aquí hay uno que usa GetUserName directamente desde advapi32.dll.
fuente
UNLEN+1
, yUNLEN
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 \
te llevará al escritorio del usuario actual
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
fuente
Si está acostumbrado a lotes, puede llamar
Básicamente, esto roba el resultado de lo que obtendría si tuviera un archivo por lotes con solo "echo% username%".
fuente
$(...)
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 ejemplopowershell 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}
fuente
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í:
fuente
Set-Location Desktop
. (Get-Location
simplemente devuelve la ubicación actual, que está implícita para aSet-Location
con una ruta relativa.)