Ответ 1
Я нашел это:
$env:UserName
Существует также:
$env:UserDomain
$env:ComputerName
Как получить текущее имя пользователя в Windows PowerShell?
Я нашел это:
$env:UserName
Существует также:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:username
- самый простой способ
Я подумал, что было бы полезно обобщить и сравнить приведенные ответы.
(проще/короче/запоминающийся вариант)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktor(более надежный вариант)
[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"
Я хотел бы добавить команду whoami, которая в основном является хорошим псевдонимом для выполнения %USERDOMAIN%\%USERNAME%
, как предложено в других ответах.
Write-Host "current user:"
Write-Host $(whoami)
[Environment]::UserName
возвращает только имя пользователя. Например. боб
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
возвращает имя пользователя, префикс его домена, где это необходимо. Например. SOMEWHERENICE\боб
Просто опираясь на работу других здесь:
[String] ${stUserDomain},[String] ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
В прошлом я использовал $env:username
, но коллега указал, что это переменная среды, и пользователь может изменить ее, и поэтому, если вы действительно хотите получить текущее имя пользователя, вам не следует ему доверять.
Я бы поддержал ответ Марка Симанна: [System.Security.Principal.WindowsIdentity] :: GetCurrent(). Name
Но мне нельзя. С помощью Mark answer, если вам нужно только имя пользователя, вам, возможно, придется его проанализировать, поскольку в моей системе он возвращает hostname\username
а на компьютерах, подключенных к домену, с учетными записями домена он возвращает domain\username
.
Я бы не стал использовать whoami.exe
так как он присутствует не во всех версиях Windows, а вызывает другой бинарный файл и может подойти некоторым командам безопасности.
Теперь, когда PowerShell Core (также известный как v6) был выпущен, и люди могут захотеть писать кроссплатформенные сценарии, многие ответы здесь не будут работать ни на чем, кроме Windows.
[Environment]::UserName
, по-видимому, является наилучшим способом получения текущего имени пользователя на всех платформах, поддерживаемых PowerShell Core, если вы не хотите добавлять в код обнаружение платформы и специальный регистр.
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
Второе имя пользователя предназначено только для отображения, только если вы копируете и вставляете его.
Я не видел никаких примеров на основе 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%".
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}
Я считаю, что проще всего использовать: cd $ home\Desktop\
В моем случае мне нужно было получить имя пользователя, чтобы скрипт мог изменить путь, т.е. C:\Users\%имя пользователя%. Мне нужно было запустить скрипт, изменив путь к рабочему столу пользователя. Я смог сделать это с помощью сверху и из других источников с помощью апплета get-location.
У вас может быть другой, или даже лучший способ сделать это, но у меня это сработало:
$ Path = Get-Location
Set-Location $ Path\Desktop
В моем случае мне нужно было восстановить имя пользователя, чтобы включить script для изменения пути, т.е. c:\users\%username%\
. Мне нужно было запустить script, изменив путь к рабочему столу пользователей. Я смог сделать это с помощью сверху и снизу, используя апплет get-location.
У вас может быть другой или даже лучший способ сделать это, но это сработало для меня:
$Path = Get-Location
Set-Location $Path\Desktop