Я подумал, что было бы полезно обобщить и сравнить приведенные ответы.
Если вы хотите получить доступ к переменной окружения :
(более простой / короткий / запоминающийся вариант)
[Environment]::UserName
- @ ThomasBratt
$env:username
- @ Eoin
whoami
- @ galaktor
(более надежный вариант)
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
- @ MarkSeemann
Если вы хотите имя вошедшего в систему пользователя
(а не имя пользователя, использующего экземпляр PowerShell)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
- @TwonOfAn на этом другом форуме
Сравнение
@ Комментарий Кевина Панко к ответу @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"