Как получить текущее имя пользователя в Windows Powershell?
Как получить текущее имя пользователя в Windows Powershell?
12 ответов
Я думал, что было бы полезно обобщить и сравнить ответы.
если вы хотите получить доступ к переменные среды:
(более легкий/более короткий/памятный вариант)
-
[Environment]::UserName
-- @ThomasBratt -
$env:username
-- @Eoin -
whoami
-- @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 в прошлом, но коллега указал, что это переменная среды и может быть изменена пользователем, и поэтому, если вы действительно хотите получить имя пользователя текущего пользователя, вы не должны доверять ему.
Я бы 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