12 ответов:
Я думал, что было бы полезно обобщить и сравнить ответы.
если вы хотите получить доступ к переменные среды:
(более простой/короткий / запоминающийся вариант)
[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 on это другой форум
сравнение
комментарий@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