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

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

12 ответов


нашел это:

$env:UserName

также:

$env:UserDomain
$env:ComputerName

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

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


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

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

(более легкий/более короткий/памятный вариант)

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

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

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

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

если вы хотите имя зарегистрированного пользователя

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


сравнение

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

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

короче, параметр переменной среды более лаконичен, а параметр маркера доступа 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"

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

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

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


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

Я бы upvote Марк Seemann's ответ:

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

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

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


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

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

и спасибо за информацию, как я получаю данные, просто и из авторитетного источника.


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

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


Я не видел никаких примеров на основе 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()

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

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

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


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

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

$Path = Get-Location

Set-Location $Path\Desktop