¿Cómo puedo obtener el nombre de usuario actual de Windows PowerShell?

¿Cómo puedo obtener el nombre de usuario actual de Windows PowerShell?

InformationsquelleAutor Thomas Bratt | 2010-01-18

15 Kommentare

  1. 364

    He encontrado:

    $env:UserName

    También hay:

    $env:UserDomain
    $env:ComputerName
    • Rápido y sucio alternativa sería $env:username para recuperar el nombre de usuario de la correspondiente variable de entorno.
    • Creo que $env:nombre de usuario y [medio Ambiente]::nombre de Usuario están apuntando a la misma cosa.
    • La respuesta es simplemente el uso de una estática .Método de RED desde dentro de Powershell que podría ser una técnica útil para su uso en otros lugares.
    • Gracias por volver a responder a su propia pregunta. Nada más frustrante cuando alguien descubre la respuesta a sí mismos y simplemente responde: «no importa, lo tengo!»
    • No está conectado el usuario, sino simplemente variables de entorno! No responder a la pregunta.
    • Que sin duda es frustrante, pero creo que hay nada más frustrante que que?!
    • Nada. No en la historia de la historia. 🙂
    • su pastebin es la referencia más completa en esta página. Debe ser una respuesta.

  2. 164
    [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
    • Esta es la más segura de la respuesta, porque $env:USERNAME puede ser alterado por el usuario, pero esto no se deje engañar por hacer eso.
    • Cierto, pero en el punto en el que no puede confiar en el usuario, hay otros, más filosófica de las preguntas que se deben responder. 😉
    • Este método incluye el nombre de dominio y nombre de usuario. Definitivamente beneficioso si tiene varios dominios en el juego.
    • Funciona como se esperaba. La prueba para la dirección url de la reserva.
    • También, esto se ve a trabajar en PowerShell 6, es decir, la cruz de la plataforma (.Neto Estándar) compatible. Pensé que valía la pena mencionar ya que me preguntó cuando me vio el espacio de nombres.
  3. 108

    Pensé que sería útil para resumir y comparar las respuestas posibles.

    Si desea acceder a la variable de entorno:

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

    • [Environment]::UserName — @ThomasBratt
    • $env:username — @Eoin
    • whoami — @galaktor

    Si desea acceder a la Windows token de acceso:

    (más confiable opción)

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

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

    (en lugar de el nombre del usuario que ejecuta el PowerShell ejemplo)

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

    Comparación

    @Kevin Panko comentario en @Marca Seemann la respuesta de ofertas con la elección de una de las categorías sobre el otro:

    [Windows token de acceso de enfoque] es la más segura de la respuesta, porque de $env:nombre de USUARIO puede ser alterado por el usuario, pero esto no se deje engañar por hacer eso.

    En resumen, la variable de entorno opción es más sucinto, y el Windows token de acceso es la opción más fiable.

    He tenido que usar @Marca Seemann de Windows del token de acceso de enfoque en un script de PowerShell que estaba ejecutando desde una aplicación en C# con la suplantación.

    La aplicación de C# se ejecuta con mi cuenta de usuario, y se ejecuta la secuencia de comandos de PowerShell como una cuenta de servicio. Debido a una limitación de la forma en que estoy ejecutando el script de PowerShell de C#, el PowerShell instancia utiliza mi cuenta de usuario variables de entorno, incluso a pesar de que se ejecuta como el usuario de cuenta de servicio.

    En esta configuración, la variable de entorno las opciones de devolver el nombre de mi cuenta, y el Windows token de acceso opción devuelve el nombre de cuenta de servicio (que es lo que yo quería), y la registra en la opción de usuario devuelve el nombre de mi cuenta.


    Pruebas

    También, si se desea comparar las opciones de sí mismo, aquí es una secuencia de comandos que puede utilizar para ejecutar una secuencia de comandos como otro usuario. Usted necesita usar el cmdlet Get-Credential para obtener una credencial de objeto y, a continuación, ejecutar esta secuencia de comandos con la secuencia de comandos para ejecutar 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

    Contenidos de Ejecución AsUser.ps1 guión:

    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"
    • Para PowerShell 6 en Mac OS X y Linux, [Environment]::UserName es la mejor opción, ya que las obras de plataforma cruzada. whoami parece funcionar también, pero depende de la whoami una herramienta que está disponible en la plataforma.
    • Para Powershell 6 en Windows, $env:USERNAME produce SYSTEM a menos que ejecute como administrador, mientras que [Environment]::UserName] rendimientos mi nombre de usuario de cualquier manera.
    • Parecer el Get-WmiObject método no funciona en la pwsh. Incluso trató de importar módulo de compatibilidad y la Microsoft.PowerShell.Management que tiene el cmdlet. Alguna idea de lo que está pasando?
    • Correcto. Fue amedrenta a Conseguir-CimInstance bastante tiempo atrás por motivos de rendimiento… y CIM se para ser usado a través de WMI en v6 para la cruz de razones de compatibilidad. Si usted ve un comando con GWMI, comprobar si se puede hacer CMMI en su lugar.
  4. 103

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

    • Puede asignar de esta manera, y crear directorios y lo que no.
  5. 50

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

    Write-Host "current user:"
    Write-Host $(whoami)
    • a mí me funciona en la versión de PS 2. Está usted diciendo que se había caído en PS3? C:\>powershell de Windows PowerShell Copyright (C) 2009 Microsoft Corporation. Todos los derechos reservados. PS C:\> whoami mydomain\myusername
    • $env:USERNAME puede ser alterado por el usuario, pero esto no se deje engañar por hacer eso.
    • whoami gana para uso interactivo. Es lo suficientemente corto como para que yo pueda recordar cómo escribir sin la consulta ASÍ 🙂
    • No es una cosa en la Nano Servidor. No lo utilice en secuencias de comandos, haga la cosa correcta ([System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
    • whoami es un ejecutable. No puede ser removido desde PowerShell. Podría ser eliminado de Windows, pero sigue allí como de la no-Nano Windows Server 2012.
    • whoami tiene el beneficio añadido sido capaz de devolver la UPN en Azure AD equipo unido para que %USERNAME% no mucho uso. Por ejemplo, $Env:nombre de Usuario devuelve RobNicholson pero mi Azure AD nombre de usuario es realmente [email protected]
    • Tenga en cuenta que si usted utiliza un sistema de administración remota que puede utilizar secuencias de comandos de Powershell, whoami devolverá el SISTEMA en lugar de que el usuario ha iniciado la sesión.

  6. 34

    [Environment]::UserName devuelve el nombre de usuario. E. g. bob
    [System.Security.Principal.WindowsIdentity]::GetCurrent().Name devuelve el nombre de usuario, con el prefijo de su dominio, cuando proceda. E. g. SOMEWHERENICE\bob

  7. 10

    He utilizado $env:username en el pasado, pero un colega señaló que es una variable de entorno y puede ser cambiado por el usuario y por lo tanto, si usted realmente desea conseguir el actual nombre de usuario, usted no debe confiar en ella.

    Me gustaría upvote Marca Seemann la respuesta:
    [Sistema.De seguridad.Director.WindowsIdentity]::GetCurrent().Nombre

    Pero no puedo. Con la Marca de la respuesta, si usted necesita sólo el nombre de usuario, usted puede tener que analizarlo ya que en mi sistema, devuelve hostname\username y en el dominio de las máquinas con las cuentas de dominio se volverá domain\username.

    Yo no los uso whoami.exe ya no está presente en todas las versiones de Windows, y es una llamada a otro binario y puede dar algunos equipos de seguridad se ajusta.

    • Desde el OP hizo preguntar acerca de Windows Powershell, eso es válido, pero [Environment]::UserName es escribir menos, independiente de $env:username y de la cruz-plataforma: Consulte pastebin.com/GsfR6Hrp
  8. 8

    Sólo basándose en el trabajo de los demás aquí:

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

    Ahora que PowerShell Core (aka v6) ha sido lanzado, y la gente lo desea, puede escribir de la cruz-plataforma de secuencias de comandos, muchas de las respuestas que aquí no va a trabajar en otra cosa que en Windows.

    [Environment]::UserName parece ser la mejor forma de obtener el nombre del usuario actual en todas las plataformas compatibles con PowerShell Core si usted no desea agregar plataforma de detección y especial de la carcasa para su código.

  10. 0
    $username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

    $username

    La segundo nombre de usuario es sólo de visualización sólo a los efectos de si copia y pega.

    • $fullname=Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty nombre de usuario $usuario=$fullname.Replace(«DOMINIO\»,»») $username
  11. -1

    Si estás acostumbrado a lote, usted puede llamar a

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

    Esto básicamente roba el resultado de lo que usted haría si usted tuvo un archivo por lotes con sólo «echo %username%».

    • Estoy downvoting porque: a) la $(...) es superfluo: $a = cmd.exe /c echo %username% obras, b) no es portable, c) que en realidad no responde a la pregunta de cómo hacerlo en powershell, responde a cómo hacerlo de dos en dos, y es mejor dar a un hombre una caña de pescar que darle un pescado, por ejemplo,powershell puts environment variables into $env, so %username% = $env:username.
  12. -1

    No veo Agregar Tipo basado en ejemplos. Aquí está uno con la 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()
    • Por favor explique lo que este código está haciendo y por qué sería más útil que uno de los métodos más corto.
    • No se pregunta por el método más corto, se pregunta cómo lograr la hazaña con powershell. Esto hace el truco de manera diferente, a continuación, el resto de los ejemplos llamando a la función dentro de la dll y el uso del Complemento Tipo de método para el acceso .NET.
    • Si bien este es un nuevo bloque de código, sería genial si yo sabía qué diablos estaba haciendo. Puede usted anotar con comentarios, tal vez? Gracias!
    • Casi me quería upvote, desde que vi el mérito a la propuesta. Sin embargo, el código tiene algunas fallas: se introduce un nuevo espacio de nombres, se utiliza una magia constante (64) cuyo valor no es lo que el médico le recetó (debe ser UNLEN+1, y UNLEN es de 256), desestima cualquier error que pudiera ser devuelto de GetUserName (a través de conserva GetLastError, un buen punto), no limpiar el búfer de cadena; y probablemente algunos otros. Y como otros dijeron, los comentarios son muy faltan, demasiado.
  13. -2
    1. get-content "cm.txt"
    2. write-host "entr file name"
      $file = read-host
      get-content $file
    3. $content = get-content "cm.txt"
    4. $content = get-content "cn.txt"
      for each ($line in $count)
      {write-host $line}
    • $contenido = get-content «cm.txt» —- $count=0—–foreach($línea $count)—-{$contador = $contador+1} —-write-host»que tienen muchas de estas líneas:» $count
    • 1. $a= $1, $com2——write-host «entrar cm nombre»—-$c =readhost—–write-host $a[$c-1].nombre de usuario, write-host $a [$c-1].contraseña
    • $com1 = new-object PSobject —–$com1 = $com1 | add-miembro noteproperty -nombre de usuario-el valor de 2016
    • $com1| ad-miembro scriptmethod cierran{stop-equipo}
    • for ($i = 21, $i = ev 77, $i++ {write-host $x [$p]} o $ i = 20 —while ($i -le 55) {write-host $n [8i] } $i++
    • ist hay una razón por la que usted agregue el código con comentarios sobre su propia respuesta?
    • tamaño – for( $i=21, $i -le, $x.longitud-1, $i++) —- { if [ $x [8i] -eq «nombre») write-host $i}
    • ¿por qué no modificar su respuesta y añadir el código en lugar de dividirlo en comentarios como ese, donde nadie va a entender?
    • seguro de que voy a hacer eso,
    • Hola ammy – bienvenido a Desbordamiento de Pila! Creo que dos cosas le ayudan a hacer de esta respuesta más útil. En primer lugar, tenga en cuenta que esta es una muy vieja pregunta con muchas respuestas, uno de los cuales ya ha sido aceptada. Si usted piensa que usted tiene una mejor respuesta, nos dicen claramente por qué la suya es la respuesta correcta. También, los comentarios son para la discusión. En lugar de comentar sobre su respuesta a añadir, es mejor editar su respuesta. Por último, aplicar sangría al código por cuatro espacios para resaltarlo como un código. Gracias!

  14. -2

    Me parece más fácil de utilizar: cd $home\Escritorio\

    te llevará a la actual usuario de escritorio

    En mi caso, necesitaba recuperar el nombre de usuario para activar la secuencia de comandos para cambiar la ruta de acceso, es decir,. c:\users\%username%. Yo necesitaba para iniciar la secuencia de comandos de cambiar la ruta de acceso para los usuarios de escritorio. Yo era capaz de hacer esto, con la ayuda de lo alto y en otros lugares, mediante la ubicación del applet.

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

    $Path = Get-Ubicación

    Set-Location $Path\Escritorio

    • Hacer suposiciones basadas en el directorio home es obligado a trabajar sólo bajo condiciones muy específicas.
    • Si usted está trabajando en un powershell terminal y, rápidamente, que quiere saber lo que el usuario, a continuación, escribir «ls ~» debe hacer el truco. Igual que el anterior cartel, puede haber excepciones, y este definitivamente no es bueno para los scripts, por lo que el uso de Edouard Pobres ejemplo en ese caso.
  15. -4

    En mi caso, necesitaba recuperar el nombre de usuario para activar la secuencia de comandos para cambiar la ruta de acceso, es decir,. c:\users\%username%\. Yo necesitaba para iniciar la secuencia de comandos de cambiar la ruta de acceso para los usuarios de escritorio. Yo era capaz de hacer esto, con la ayuda de lo alto y en otros lugares, mediante la get-ubicación applet.

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

    $Path = Get-Location
    
    Set-Location $Path\Desktop
    • Bienvenido a Desbordamiento de Pila! Esto es equivalente a Set-Location Desktop. (Get-Location simplemente devuelve la ubicación actual, que es implícito para un Set-Location con una ruta de acceso relativa.)

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea