Как получить текущее имя пользователя в Windows PowerShell?
Как получить текущее имя пользователя в Windows PowerShell?
Ответ 1
Я нашел это:
$env:UserName
Существует также:
$env:UserDomain
$env:ComputerName
Ответ 2
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
Ответ 3
$env:username
- самый простой способ
Ответ 4
Я подумал, что было бы полезно обобщить и сравнить приведенные ответы.
Если вы хотите получить доступ к переменной окружения:
(проще/короче/запоминающийся вариант)
-
[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 на этом другом форуме
сравнение
@Kevin Panko комментирует ответ @Mark Seemann о выборе одной из категорий над другой:
[Подход с использованием маркера доступа Windows] является наиболее безопасным ответом, потому что пользователь может изменить $ env: USERNAME, но это не обманет.
Короче говоря, параметр переменной среды является более лаконичным, а параметр маркера доступа Windows - более надежным.
Мне пришлось использовать подход @Mark Seemann для Windows-маркеров доступа в скрипте PowerShell, который я запускал из приложения С# с имитацией.
Приложение С# запускается с моей учетной записью пользователя и запускает сценарий PowerShell в качестве учетной записи службы. Из-за ограничения способа запуска сценария PowerShell из С# экземпляр 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"
Ответ 5
Я хотел бы добавить команду whoami, которая в основном является хорошим псевдонимом для выполнения %USERDOMAIN%\%USERNAME%
, как предложено в других ответах.
Write-Host "current user:"
Write-Host $(whoami)
Ответ 6
[Environment]::UserName
возвращает только имя пользователя. Например. боб
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
возвращает имя пользователя, префикс его домена, где это необходимо. Например. SOMEWHERENICE\боб
Ответ 7
Просто опираясь на работу других здесь:
[String] ${stUserDomain},[String] ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
Ответ 8
В прошлом я использовал $env:username
, но коллега указал, что это переменная среды, и пользователь может изменить ее, и поэтому, если вы действительно хотите получить текущее имя пользователя, вам не следует ему доверять.
Я бы поддержал ответ Марка Симанна: [System.Security.Principal.WindowsIdentity] :: GetCurrent(). Name
Но мне нельзя. С помощью Mark answer, если вам нужно только имя пользователя, вам, возможно, придется его проанализировать, поскольку в моей системе он возвращает hostname\username
а на компьютерах, подключенных к домену, с учетными записями домена он возвращает domain\username
.
Я бы не стал использовать whoami.exe
так как он присутствует не во всех версиях Windows, а вызывает другой бинарный файл и может подойти некоторым командам безопасности.
Ответ 9
Теперь, когда PowerShell Core (также известный как v6) был выпущен, и люди могут захотеть писать кроссплатформенные сценарии, многие ответы здесь не будут работать ни на чем, кроме Windows.
[Environment]::UserName
, по-видимому, является наилучшим способом получения текущего имени пользователя на всех платформах, поддерживаемых PowerShell Core, если вы не хотите добавлять в код обнаружение платформы и специальный регистр.
Ответ 10
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
Второе имя пользователя предназначено только для отображения, только если вы копируете и вставляете его.
Ответ 11
Я не видел никаких примеров на основе 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()
Ответ 12
Если вы привыкли к пакету, вы можете позвонить
$user=$(cmd.exe /c echo %username%)
Это в основном крадет вывод из того, что вы получили бы, если бы у вас был пакетный файл с просто "echo% username%".
Ответ 13
-
get-content "cm.txt"
-
write-host "entr file name" $file = read-host get-content $file
-
$content = get-content "cm.txt"
-
$content = get-content "cn.txt" for each ($line in $count) {write-host $line}
Ответ 14
Я считаю, что проще всего использовать: cd $ home\Desktop\
перенесет вас на рабочий стол текущего пользователя
В моем случае мне нужно было получить имя пользователя, чтобы скрипт мог изменить путь, т.е. C:\Users\%имя пользователя%. Мне нужно было запустить скрипт, изменив путь к рабочему столу пользователя. Я смог сделать это с помощью сверху и из других источников с помощью апплета get-location.
У вас может быть другой, или даже лучший способ сделать это, но у меня это сработало:
$ Path = Get-Location
Set-Location $ Path\Desktop
Ответ 15
В моем случае мне нужно было восстановить имя пользователя, чтобы включить script для изменения пути, т.е. c:\users\%username%\
. Мне нужно было запустить script, изменив путь к рабочему столу пользователей. Я смог сделать это с помощью сверху и снизу, используя апплет get-location.
У вас может быть другой или даже лучший способ сделать это, но это сработало для меня:
$Path = Get-Location
Set-Location $Path\Desktop