Как получить текущее имя пользователя в Windows PowerShell?

Как получить текущее имя пользователя в Windows PowerShell?

Ответ 1

Я нашел это:

$env:UserName

Существует также:

$env:UserDomain
$env:ComputerName

Ответ 2

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

Ответ 3

$env:username - самый простой способ

Ответ 4

Я подумал, что было бы полезно обобщить и сравнить приведенные ответы.

Если вы хотите получить доступ к переменной окружения:

(проще/короче/запоминающийся вариант)

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

Если вы хотите получить доступ к токену доступа Windows:

(более надежный вариант)

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

Если вы хотите имя вошедшего в систему пользователя

(а не имя пользователя, на котором запущен экземпляр PowerShell)


сравнение

@Kevin Panko комментирует ответ @Mark Seemann о выборе одной из категорий над другой:

[Подход с использованием маркера доступа Windows] является наиболее безопасным ответом, потому что пользователь может изменить $ env: USERNAME, но это не обманет.

Короче говоря, параметр переменной среды является более лаконичным, а параметр маркера доступа Windows - более надежным.

Мне пришлось использовать подход @Mark Seemann для Windows-маркеров доступа в скрипте PowerShell, который я запускал из приложения С# с имитацией.

Приложение С# запускается с моей учетной записью пользователя и запускает сценарий PowerShell в качестве учетной записи службы. Из-за ограничения способа запуска сценария PowerShell из С# экземпляр PowerShell использует переменные среды моей учетной записи пользователя, даже если он запускается как пользователь учетной записи службы.

В этой настройке параметры переменной среды возвращают имя моей учетной записи, а параметр токена доступа Windows возвращает имя учетной записи службы (именно это я и хотел), а параметр зарегистрированного пользователя возвращает имя моей учетной записи.


тестирование

Также, если вы хотите сравнить параметры самостоятельно, вот скрипт, который вы можете использовать для запуска скрипта от имени другого пользователя. Вам нужно использовать командлет Get-Credential, чтобы получить объект учетных данных, а затем запустить этот сценарий со сценарием для запуска в качестве другого пользователя в качестве аргумента 1, а объект учетных данных в качестве аргумента 2.

Использование:

$cred = Get-Credential UserTo.RunAs
Run-AsUser.ps1 "whoami; pause" $cred
Run-AsUser.ps1 "[System.Security.Principal.WindowsIdentity]::GetCurrent().Name; pause" $cred

Содержимое скрипта 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"

Ответ 5

Я хотел бы добавить команду whoami, которая в основном является хорошим псевдонимом для выполнения %USERDOMAIN%\%USERNAME%, как предложено в других ответах.

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

Ответ 6

[Environment]::UserName возвращает только имя пользователя. Например. боб [System.Security.Principal.WindowsIdentity]::GetCurrent().Name возвращает имя пользователя, префикс его домена, где это необходимо. Например. SOMEWHERENICE\боб

Ответ 7

Просто опираясь на работу других здесь:

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

Ответ 8

В прошлом я использовал $env:username, но коллега указал, что это переменная среды, и пользователь может изменить ее, и поэтому, если вы действительно хотите получить текущее имя пользователя, вам не следует ему доверять.

Я бы поддержал ответ Марка Симанна: [System.Security.Principal.WindowsIdentity] :: GetCurrent(). Name

Но мне нельзя. С помощью Mark answer, если вам нужно только имя пользователя, вам, возможно, придется его проанализировать, поскольку в моей системе он возвращает hostname\username а на компьютерах, подключенных к домену, с учетными записями домена он возвращает domain\username.

Я бы не стал использовать whoami.exe так как он присутствует не во всех версиях Windows, а вызывает другой бинарный файл и может подойти некоторым командам безопасности.

Ответ 9

Теперь, когда PowerShell Core (также известный как v6) был выпущен, и люди могут захотеть писать кроссплатформенные сценарии, многие ответы здесь не будут работать ни на чем, кроме Windows.

[Environment]::UserName, по-видимому, является наилучшим способом получения текущего имени пользователя на всех платформах, поддерживаемых PowerShell Core, если вы не хотите добавлять в код обнаружение платформы и специальный регистр.

Ответ 10

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

$username

Второе имя пользователя предназначено только для отображения, только если вы копируете и вставляете его.

Ответ 11

Я не видел никаких примеров на основе Add-Type. Вот тот, кто использует GetUserName непосредственно из 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()

Ответ 12

Если вы привыкли к пакету, вы можете позвонить

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

Это в основном крадет вывод из того, что вы получили бы, если бы у вас был пакетный файл с просто "echo% username%".

Ответ 13

  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}

Ответ 14

Я считаю, что проще всего использовать: cd $ home\Desktop\

перенесет вас на рабочий стол текущего пользователя

В моем случае мне нужно было получить имя пользователя, чтобы скрипт мог изменить путь, т.е. C:\Users\%имя пользователя%. Мне нужно было запустить скрипт, изменив путь к рабочему столу пользователя. Я смог сделать это с помощью сверху и из других источников с помощью апплета get-location.

У вас может быть другой, или даже лучший способ сделать это, но у меня это сработало:

$ Path = Get-Location

Set-Location $ Path\Desktop

Ответ 15

В моем случае мне нужно было восстановить имя пользователя, чтобы включить script для изменения пути, т.е. c:\users\%username%\. Мне нужно было запустить script, изменив путь к рабочему столу пользователей. Я смог сделать это с помощью сверху и снизу, используя апплет get-location.

У вас может быть другой или даже лучший способ сделать это, но это сработало для меня:

$Path = Get-Location

Set-Location $Path\Desktop