varios usuarios usuario script políticas para modificar masivo locales domino cuentas crear atributos agregar active windows powershell scripting

windows - usuarios - powershell agregar usuario



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

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


  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}

Ahora que se ha lanzado Powershell Core (también conocido como v6), y la gente puede 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 una carcasa especial a su código.


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 de otras partes, usando el applet get-location .

Es posible que tengas otra forma de hacerlo, o incluso mejor, pero esto me funcionó:

$Path = Get-Location Set-Location $Path/Desktop


He usado $ env: nombre de usuario 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 actual, no debe confiar en él.

Me gustaría votar 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 de dominio con cuentas de dominio devolverá el 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 ajustes a los equipos de seguridad.


Lo encontré:

$env:UserName

También hay:

$env:UserDomain $env:ComputerName


Me gustaría whoami 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)


No vi ningún ejemplo de tipo add-add, aquí hay 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()


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 / 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 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 foro

Comparación

El comentario de @Kevin Panko sobre la respuesta de @Mark Seemann se refiere a 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 al hacer eso.

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.

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 powershell como una cuenta de servicio. Debido a una limitación de 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 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 de token de acceso a Windows devuelve el nombre de la cuenta de servicio (que es lo que quería), y la opción de usuario registrado devuelve mi nombre de 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 ejecute este script con el script para ejecutarse 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"


Si estás acostumbrado a hacer lotes, puedes llamar

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

Básicamente, esto roba el resultado de lo que obtendrías si tuvieras un archivo por lotes con solo "echo% username%".


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.


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


[Environment]::UserName devuelve solo el nombre de usuario. Por ejemplo, bob [System.Security.Principal.WindowsIdentity]::GetCurrent().Name devuelve el nombre de usuario, con el prefijo de su dominio donde sea apropiado. Ej. Alguien de / Bob


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