¿Cómo obtengo el nombre de usuario actual en Windows PowerShell?
windows
powershell
scripting
Thomas Bratt
fuente
fuente

$env:usernamerecuperar el nombre de usuario de la variable de entorno correspondiente.fuente
$env:USERNAMEpuede 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]::UserNamees la mejor opción, ya que funciona multiplataforma.whoamiParece que también funciona, pero depende de lawhoamiherramienta que esté disponible en la plataforma.$env:USERNAMEproduce aSYSTEMmenos que lo ejecute como administrador, mientras que[Environment]::UserName]produce mi nombre de usuario de cualquier manera.Get-WmiObjectmétodo ya no funciona en pwsh. Incluso trató de importar el módulo de compatibilidad y elMicrosoft.PowerShell.Managementque tiene el cmdlet. ¿Alguna idea de lo que está pasando?$env:usernamees 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:USERNAMEpuede ser alterado por el usuario, pero esto no se dejará engañar haciendo eso.[System.Security.Principal.WindowsIdentity]::GetCurrent().Name)whoamiEs 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]::UserNamedevuelve solo el nombre de usuario. Por ejemplo, bob[System.Security.Principal.WindowsIdentity]::GetCurrent().Namedevuelve el nombre de usuario, prefijado por su dominio cuando corresponda. Ej. ALGUNA HERENCIA \ bobfuente
He usado
$env:usernameen 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\usernamey en máquinas unidas a un dominio con cuentas de dominio, lo devolverádomain\username.No lo usaría,
whoami.exeya 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]::UserNamees menos tipeado, independiente$env:usernamey 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]::UserNameparece 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
$usernameEl 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, yUNLENes 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-Locationsimplemente devuelve la ubicación actual, que está implícita para aSet-Locationcon una ruta relativa.)