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

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

Lo encontré:

$env:UserName 

También hay:

 $env:UserDomain $env:ComputerName 
 [System.Security.Principal.WindowsIdentity]::GetCurrent().Name 

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

Pensé que sería valioso resumir y comparar las respuestas dadas.

Si quieres acceder a la variable de entorno :

(opción más fácil / más corta / memorable)

  • [Environment]::UserName Nombre de usuario – @ThomasBratt
  • $env:username – @Eoin
  • whoami – @galaktor

Si desea acceder al token de acceso de Windows :

(Opción más confiable)

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

Si quieres el nombre del usuario que ha iniciado sesión

(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 método token de acceso a Windows] es la respuesta más segura porque $ env: USERNAME puede ser alterado por el usuario, pero esto no será engañado al hacer eso.

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

Tuve que utilizar el enfoque de token de acceso a 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 de la forma en que estoy ejecutando el script de PowerShell desde C #, la instancia de PowerShell usa las variables de entorno de mi cuenta de usuario, aunque se ejecute como el usuario de la cuenta de servicio. En esta configuración, las opciones de variables de entorno devuelven el nombre de mi cuenta, y la opción token de acceso de Windows devuelve el nombre de la cuenta de servicio (que es lo que yo quería), y la opción de usuario que inició sesión devuelve el nombre de mi cuenta.


Pruebas

Además, si quiere 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" 

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

 Write-Host "current user:" Write-Host $(whoami) 

[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, según corresponda. Ej. SOMEWHERENICE \ bob

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

Resumiría la respuesta de Mark Seemann:

 [System.Security.Principal.WindowsIdentity]::GetCurrent().Name 

pero no estoy permitido. Con la respuesta de Mark, si solo necesita el nombre de usuario, es posible que deba analizarlo, ya que en mi sistema, devuelve nombre de host \ nombre de usuario y en máquinas unidas por dominio con cuentas de dominio devolverá dominio \ nombre de usuario.

No utilizaría whoami.exe ya que no está presente en todas las versiones de Windows y es una llamada a otro binario y puede dar cabida a algunos equipos de seguridad.

Simplemente aprovechando 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.

Ahora que se ha lanzado Powershell Core (también conocido como v6), y es posible que las personas quieran escribir scripts multiplataforma, muchas de las respuestas aquí no funcionarán en otra cosa que no sea Windows.

[Environment]::UserName parece ser la mejor forma 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.

Si está acostumbrado a realizar un lote, puede llamar

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

Esto básicamente roba el resultado de lo que obtendrías si tuvieras un archivo por lotes con solo “echo% username username%”.

No vi ningún tipo de complemento basado en ejemplos, aquí está uno que utiliza 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() 

En mi caso, necesitaba recuperar el nombre de usuario para permitir que el script cambie 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 en otros lugares, usando el applet get-location .

Puede tener otra, o incluso mejor, forma de hacerlo, pero esto funcionó para mí:

 $Path = Get-Location Set-Location $Path\Desktop 
    Intereting Posts