Как получить текущее имя пользователя в Windows PowerShell? - PullRequest
268 голосов
/ 18 января 2010

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

Ответы [ 15 ]

335 голосов
/ 18 января 2010

Я нашел это:

$env:UserName

Также есть:

$env:UserDomain
$env:ComputerName
154 голосов
/ 18 января 2010
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
103 голосов
/ 14 октября 2011

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

98 голосов
/ 30 апреля 2015

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

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

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

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

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

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

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

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

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


Сравнение

@ Комментарий Кевина Панко к ответу @Mark Seemann касается выбора одной из категорий над другой:

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

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

Мне пришлось использовать подход маркера доступа Windows @Mark Seemann в скрипте 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"
49 голосов
/ 14 ноября 2011

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

Write-Host "current user:"
Write-Host $(whoami)
34 голосов
/ 14 июля 2011

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

8 голосов
/ 24 января 2017

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

Я бы приветствовал ответ Марка Симанна: [System.Security.Principal.WindowsIdentity] :: GetCurrent (). Имя * * 1004

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

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

8 голосов
/ 04 августа 2016

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

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
6 голосов
/ 15 марта 2018

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

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

0 голосов
/ 06 июня 2019
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

$username

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...