Как мне получить текущее имя пользователя в Windows PowerShell?
Как мне получить текущее имя пользователя в Windows PowerShell?
Ответы (14)
Я нашел это:
$env:UserName
Есть также:
$env:UserDomain
$env:ComputerName
$env:username
получить имя пользователя из соответствующей переменной среды.
- person guillermooo; 21.01.2010
Я подумал, что было бы полезно обобщить и сравнить полученные ответы.
Если вы хотите получить доступ к переменной среды:
(вариант проще / короче / запоминающийся)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktor
Если вы хотите получить доступ к Токен доступа Windows:
(более надежный вариант)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @MarkSeemann
Если вы хотите, чтобы имя вошедшего в систему пользователя
(а не имя пользователя, запустившего экземпляр PowerShell)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- @TwonOfAn на этом другом форуме
Сравнение
Комментарий @Kevin Panko к ответу @Mark Seemann касается выбора одной из категорий над другой:
[Подход с использованием токена доступа Windows] является наиболее безопасным ответом, потому что $ env: USERNAME может быть изменено пользователем, но это не обманет вас.
Короче говоря, параметр переменной среды более лаконичен, а параметр токена доступа Windows более надежен.
Мне пришлось использовать подход @Mark Seemann к токену доступа Windows в сценарии PowerShell, который я запускал из приложения C # с олицетворением.
Приложение C # запускается с моей учетной записью пользователя и запускает сценарий PowerShell как учетную запись службы. Из-за ограничений способа запуска сценария PowerShell из C # экземпляр 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"
[Environment]::UserName
- лучший вариант, поскольку он работает на разных платформах. whoami
, похоже, тоже работает, но зависит от whoami
инструмента, доступного на платформе.
- person Florian Feldhaus; 18.01.2018
$env:USERNAME
создает SYSTEM
, если я не запускаю его от имени администратора, а [Environment]::UserName]
в любом случае возвращает мое имя пользователя.
- person kfsone; 25.07.2018
Get-WmiObject
больше не работает в pwsh. Даже пытался импортировать модуль совместимости и Microsoft.PowerShell.Management
, в котором есть командлет. Есть идеи, что происходит?
- person not2qubit; 04.02.2019
$env:username
это самый простой способ
Я хотел бы добавить команду whoami, которая в основном является хорошим псевдонимом для выполнения %USERDOMAIN%\%USERNAME%
, как предлагается в других ответах.
Write-Host "current user:"
Write-Host $(whoami)
$env:USERNAME
может быть изменен пользователем, но это не обманет его.
- person Kevin Panko; 24.04.2014
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)
- person Yet Another User; 17.10.2016
whoami
- исполняемый файл. Его нельзя удалить из PowerShell. Потенциально он может быть удален из Windows, но он все еще присутствует в Windows Server 2012, отличном от Nano.
- person jpmc26; 11.03.2017
[Environment]::UserName
возвращает только имя пользователя. Например. bob [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
возвращает имя пользователя с префиксом домена, где это необходимо. Например. SOMEWHERENICE \ bob
Теперь, когда выпущено PowerShell Core (также известное как v6), люди могут захотеть напишите кросс-платформенные скрипты, многие ответы здесь не будут работать ни на чем, кроме Windows.
[Environment]::UserName
, по-видимому, является лучшим способом получить текущее имя пользователя на всех платформах, поддерживаемых PowerShell Core, если вы не хотите добавлять в свой код определение платформы и специальный регистр.
Раньше я использовал $env:username
, но коллега указал, что это переменная среды, которая может быть изменена пользователем, поэтому, если вы действительно хотите получить имя пользователя текущего пользователя, вам не следует доверять ему.
Я бы поддержал ответ Марка Симанна: [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Name
Но мне не разрешено. С ответом Марка, если вам нужно только имя пользователя, вам, возможно, придется проанализировать его, поскольку в моей системе он возвращает hostname\username
, а на подключенных к домену машинах с учетными записями домена он возвращает domain\username
.
Я бы не стал использовать whoami.exe
, поскольку он присутствует не во всех версиях Windows, и это вызов другого двоичного файла, который может подойти некоторым группам безопасности.
[Environment]::UserName
меньше набирает, независимо от $env:username
и кроссплатформенности: см. pastebin.com/GsfR6Hrp
- person kfsone; 23.09.2018
Просто опираясь на работу других здесь:
[String] ${stUserDomain},[String] ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
второе имя пользователя используется только для отображения, только если вы скопируете и вставите его.
Я не видел никаких 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()
UNLEN+1
, а UNLEN
равно 256), он игнорирует любые ошибки, которые могут быть возвращены из GetUserName. (из-за того, что сохраняет GetLastError, хороший момент), он не очищает строковый буфер; и, возможно, некоторые другие. И, как говорили другие, комментариев тоже очень не хватает.
- person AntoineL; 10.05.2017
Если вы привыкли к пакетной обработке, вы можете позвонить
$user=$(cmd.exe /c echo %username%)
Это в основном крадет вывод из того, что вы получили бы, если бы у вас был командный файл только с "echo% username%".
$(...)
лишнее: $a = cmd.exe /c echo %username%
работает, б) он не переносится, в) он фактически не отвечает на вопрос, как это сделать в PowerShell, он отвечает, как это сделать в dos, и лучше дать человеку удочку, чем рыбу, например powershell puts environment variables into $env, so %username% = $env:username
.
- person kfsone; 23.09.2018
Я считаю, что проще всего использовать: cd $ home \ Desktop \
перенесет вас на рабочий стол текущего пользователя
В моем случае мне нужно было получить имя пользователя, чтобы сценарий мог изменить путь, т.е. c: \ users \% username%. Мне нужно было запустить скрипт, изменив путь к рабочему столу пользователя. Я смог сделать это с помощью сверху и из других источников, используя апплет get-location.
У вас может быть другой или даже лучший способ сделать это, но у меня это сработало:
$ Path = Get-Location
Set-Location $ Путь \ Рабочий стол
В моем случае мне нужно было получить имя пользователя, чтобы сценарий мог изменить путь, т.е. c:\users\%username%\
. Мне нужно было запустить скрипт, изменив путь к рабочему столу пользователя. Я смог сделать это с помощью сверху и из других источников с помощью апплета get-location.
У вас может быть другой или даже лучший способ сделать это, но у меня это сработало:
$Path = Get-Location
Set-Location $Path\Desktop
Set-Location Desktop
. (Get-Location
просто возвращает текущее местоположение, что неявно для Set-Location
с относительным путем.)
- person jpaugh; 18.01.2016
$env:USERNAME
может быть изменен пользователем, но это не обманет его.
- person Kevin Panko; 24.04.2014