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



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

759   12  

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 в прошлом, но коллега указал, что это переменная среды и может быть изменена пользователем, и поэтому, если вы действительно хотите получить имя пользователя текущего пользователя, вы не должны доверять ему.

Я бы здесь ответил Марк Зееман это:

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

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

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

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

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

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

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

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

Я не видел никаких примеров на основе добавления типа, вот один, использующий 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

Comments

    Ничего не найдено.