¿Cómo obtener el nombre de usuario actual en Windows Powershell?


¿Cómo obtener el nombre de usuario actual en Windows Powershell?

Author: Thomas Bratt, 2010-01-18

12 answers

Lo encontré:

$env:UserName

También Hay:

$env:UserDomain
$env:ComputerName
 282
Author: Thomas Bratt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-21 02:40:44
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
 132
Author: Mark Seemann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-18 11:54:21

$env:username es la forma más fácil

 98
Author: Eoin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-25 07:52:51

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 @ @ Eoin
  • whoami @ @ galaktor

Si desea acceder a la token de acceso de Windows:

(opción más confiable)

  • [System.Security.Principal.WindowsIdentity]::GetCurrent().Name -- @MarkSeemann

Si desea el nombre del usuario registrado

(en lugar del nombre del usuario que ejecuta la instancia de PowerShell)

  • $(Get-WMIObject -class Win32_ComputerSystem | select username).username @ @ TwonOfAn en este otro foro

Comparación

El 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 será engañado por hacer eso.

En resumen, la opción variable de entorno es más sucinta, y la opción token de acceso de Windows es más confiable.

He tenido 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 de 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 del mismo modo en que estoy ejecutando el script de PowerShell desde C#, la instancia de PowerShell utiliza las variables de entorno de mi cuenta de usuario, aunque se ejecute como usuario de la cuenta de servicio. En esta configuración, las opciones de la variable de entorno devuelven mi nombre de cuenta, y la opción token de acceso de Windows devuelve el nombre de la cuenta de servicio (que es lo que quería), y la opción usuario conectado devuelve mi nombre de cuenta.


Pruebas

Además, si desea comparar las opciones usted mismo, aquí hay un script se puede utilizar para ejecutar un script como otro usuario. Debe usar el cmdlet Get-Credential para obtener un objeto de credenciales y, a continuación, ejecutar este script con el script para ejecutar como otro usuario como argumento 1 y el objeto de credenciales 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"
 73
Author: alexanderbird,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-25 20:01:21

Me gustaría agregar el comando whoami, que básicamente es un buen alias para hacer %USERDOMAIN%\%USERNAME% como se propone en otras respuestas.

Write-Host "current user:"
Write-Host $(whoami)
 45
Author: galaktor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-14 09:08:35

[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. Por ejemplo, EN ALGÚN lugar NICE \ bob

 32
Author: WaffleSouffle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-14 12:19:30

He usado $env:username en el pasado, pero un colega señaló que es una variable de entorno y puede ser cambiada por el usuario y, por lo tanto, si realmente desea obtener el nombre de usuario del usuario actual, no debe confiar en él.

Votaría a favor de 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, devuelve el nombre de host\nombre de usuario y en las máquinas unidas al dominio con cuentas de dominio devolverá dominio \ nombre de usuario.

No 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 equipos de seguridad encaja.

 6
Author: Dave Hull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-24 17:21:08

Simplemente construyendo sobre el trabajo de otros aquí:

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")

Y gracias por la información, ya que me gusta obtener los datos de manera simple y de una fuente autorizada.

 4
Author: Stef,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-04 17:00:46

Ahora que Powershell Core (también conocido como v6) ha sido lanzado, y la gente puede querer escribir scripts multiplataforma, muchas de las respuestas aquí no funcionarán en nada 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 encapsulado especial al código.

 2
Author: Edouard Poor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-15 20:37:59

No vi ningún ejemplo basado en add-type, aquí hay uno que utiliza el 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()
 -1
Author: Knuckle-Dragger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-03 20:09:19

Si estás acostumbrado a batch, puedes llamar a

$user=$(cmd.exe /c echo %username%)

Esto básicamente roba la salida de lo que obtendría si tuviera un archivo por lotes con solo "echo %username%".

 -1
Author: shaws,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-06 21:37:03

En mi caso, necesitaba recuperar el nombre de usuario para habilitar el script para cambiar la ruta, es decir. c:\users\%username%\. Necesitaba iniciar 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.

Usted puede tener otra, o incluso mejor manera de hacerlo, pero esto funcionó para mí:

$Path = Get-Location

Set-Location $Path\Desktop
 -3
Author: kjp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-30 17:57:55