Як отримати поточне ім'я користувача в Windows PowerShell?


Відповіді:


397

Я знайшов це:

$env:UserName

Є також:

$env:UserDomain
$env:ComputerName

10
Швидкою та брудною альтернативою було б $env:usernameотримання імені користувача з відповідної змінної середовища.
guillermooo

7
Я думаю, що $ env: username та [Environment] :: UserName обидва вказують на одне і те ж.
Кефа

16
Дякуємо, що повернулися, щоб відповісти на власне запитання. Немає нічого страшнішого, коли хтось сам з'ясовує відповідь і просто відповідає: "Нічого, зрозумів!"
Метт Дітроліо

6
@MattDiTrolio Це, звичайно, засмучує, але ти вважаєш, що немає нічого страшнішого, ніж це ?!
Code Jockey

5
@CodeJockey Нічого. Не в історії ніколи. :)
Метт Дітроліо

180
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name

16
Це найбезпечніша відповідь, оскільки $env:USERNAMEїї можна змінити користувачем, але це не обдурить, зробивши це.
Кевін Панько

6
@KevinPanko Щоправда, але, якщо ви не можете довіряти своєму користувачеві, є інші, більш філософські питання, які потрібно задати. ;-)
jpaugh

4
Цей метод включає доменне ім’я та ім’я користувача. Однозначно вигідно, якщо у вас є кілька доменів.
Райан Гейтс

Працює як очікувалося. Тестовано для бронювання адреси URL.
Марек Бар

Крім того, схоже, це працює і в PowerShell 6, тобто сумісна міжплатформатна платформа (.Net Standard). Думав, що це варто згадати, оскільки я допитав його, коли побачив простір імен.
смертельної собаки

120

Я вважав, що було б корисно узагальнити та порівняти наведені відповіді.

Якщо ви хочете отримати доступ до змінної середовища :

(простіший / коротший / запам'ятовується варіант)

  • [Environment]::UserName - @ThomasBratt
  • $env:username - @Eoin
  • whoami - @galaktor

Якщо ви хочете отримати доступ до маркера доступу для Windows :

(більш надійний варіант)

  • [System.Security.Principal.WindowsIdentity]::GetCurrent().Name - @MarkSeemann

Якщо ви хочете ім'я користувача, який увійшов

(а не ім'я користувача, який працює з екземпляром PowerShell)


Порівняння

Коментар @Kevin Panko до відповіді @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"

Для PowerShell 6 на Mac OS X та Linux, [Environment]::UserNameце найкращий варіант, оскільки він працює на крос-платформах. whoamiЗдається, також працює, але залежить від того, який whoamiінструмент буде доступний на платформі.
Флоріан Фельдхаус

Для Powershell 6 у Windows $env:USERNAMEвиробляє, SYSTEMякщо я не запускаюсь адміністратором, а в [Environment]::UserName]будь-якому випадку дає своє ім’я користувача.
kfsone

1
Здається, що Get-WmiObjectметод більше не працює в pwsh. Навіть намагався імпортувати модуль сумісності та той, Microsoft.PowerShell.Managementщо має командлет. Будь-яка ідея, що відбувається?
not2qubit

Правильно. Він був турбують до Get-CimInstance досить тривалого часу назад з міркувань продуктивності ... і CIM повинен бути використаний в протягом WMI в v6 з причин крос-сумісності. Якщо ви бачите команду з GWMI, перевірте, чи можете ви зробити GCIM замість цього.
Hicsy

105

$env:username це найпростіший спосіб


Ви можете призначити це таким чином, і створити каталоги, а що ні.
Droogans

51

Я хотів би вписати команду whoami , що в основному є приємним псевдонімом для виконання, %USERDOMAIN%\%USERNAME%як пропонується в інших відповідях.

Write-Host "current user:"
Write-Host $(whoami)

він працює для мене на PS версії 2. Ти кажеш, його було скинуто в PS3? C: \> повноваження Windows PowerShell Copyright (C) 2009 Microsoft Corporation. Всі права захищені. PS C: \> whoami mydomain \ myusername
галактор

2
$env:USERNAMEможе бути змінено користувачем, але це не обдурить це.
Кевін Панько

3
whoami виграє за інтерактивне використання. Це досить коротко, що я можу згадати, як це ввести, не порадившись ТАК :-)
Ієн Самуель Маклін Старший

Не є річ у Nano Server. Не використовуйте його в сценаріях, зробіть правильно ( [System.Security.Principal.WindowsIdentity]::GetCurrent().Name)
Ще один користувач

whoamiє виконуваним файлом. Його не можна видалити з PowerShell. Його потенційно можна видалити з Windows, але він все ще є, як і для не-нано Windows Server 2012.
jpmc26

37

[Environment]::UserNameповертає лише ім'я користувача. Напр. Bob [System.Security.Principal.WindowsIdentity]::GetCurrent().Name повертає ім’я користувача з префіксом домену, де це доречно. Наприклад, ДЕЯКІСТЬ \ bob


12

Раніше я використовував $env:username, але колега зазначив, що це змінна середовище, і її можна змінити користувачем, тому, якщо ви дійсно хочете отримати ім'я користувача поточного користувача, вам не слід довіряти цьому.

Я б схвалив відповідь Марка Семана: [System.Security.Principal.WindowsIdentity] :: GetCurrent ().

Але мені це не дозволено. Відповідь Марка, якщо вам потрібно лише ім'я користувача, вам, можливо, доведеться проаналізувати його, оскільки в моїй системі воно повертається, hostname\usernameа на приєднаних до домену машинах з обліковими записами домену воно повернеться domain\username.

Я б не користувався, whoami.exeоскільки він присутній не у всіх версіях Windows, а це виклик в інший бінарний файл і може привести до відповідності деяким командам безпеки.


1
Оскільки ОП не питав про Windows-Powershell, це діє, але [Environment]::UserNameменш типування, незалежно від $env:usernameі крос-платформний: Див pastebin.com/GsfR6Hrp
kfsone

12

Тепер, коли PowerShell Core (він же v6) був випущений, і люди, можливо, захочуть писати міжплатформні сценарії, багато відповідей тут не працюватимуть ні на що, окрім Windows.

[Environment]::UserName видається найкращим способом отримання поточного імені користувача на всіх платформах, що підтримуються PowerShell Core, якщо ви не хочете додавати в свій код виявлення платформи та спеціальний корпус.


10

Просто спираючись на роботу інших людей тут:

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")

1
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

$username

Друге ім'я користувача для відображення тільки в цілях , тільки якщо скопіювати і вставити його.


$ fullname = Get-WMIObject -класс Win32_ComputerSystem | Select-Object -ExpandProperty username $ username = $ fullname.Замініть ("DOMAIN \", "") $ username
clayton.nichols

-1

Я не бачив прикладів на основі 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()

1
Поясніть, будь ласка, для чого цей код і чому він буде кориснішим за один із коротших методів.
Бенджамін Хаббард

@BenjaminHubbard Питання не задає найкоротший метод, він запитує, як здійснити подвиг за допомогою shellhell. Це робить трюк інакше, ніж інші приклади, викликаючи функцію всередині dll та використовуючи метод Add-Type для доступу до .NET.
Knuckle-Dragger

1
Хоча це блок коду роману, було б чудово, якби я знав, що, чорт, робить. Чи можете ви це помітити коментарями? Дякую!
jpaugh

1
Я майже хотів отримати підтримку, оскільки бачив заслуги перед цією пропозицією. Однак у коду є деякі недоліки: він вводить нову область імен, він використовує магічну константу (64), значення якої не є тим, що призначив лікар (повинно бути UNLEN+1, і UNLENстановить 256), він ігнорує будь-яку помилку, яку можна повернути з GetUserName (через він зберігає GetLastError, хороший момент), він не очищає буфер рядків; і, мабуть, деякі інші. А як казали інші, коментарів теж сильно не вистачає.
АнтуанЛ

-1

Я вважаю найпростішим у використанні: cd $ home \ Desktop \

перенесе вас на робочий стіл користувача

У моєму випадку мені потрібно було отримати ім’я користувача, щоб сценарій міг змінити шлях, тобто. c: \ користувачів \% ім'я користувача%. Мені потрібно було запустити сценарій, змінивши шлях до робочого столу користувачів. Я зміг це зробити за допомогою зверху та в іншому місці за допомогою аплета get-location.

У вас може бути інший або навіть кращий спосіб зробити це, але це працювало для мене:

$ Path = Отримати місцезнаходження

Встановити місце розташування $ Шлях \ Настільний


Здійснення будь-яких припущень на основі домашнього каталогу зобов’язане працювати лише у дуже конкретних умовах.
Рауль Салінас-Монтеагудо

Якщо ви працюєте в терміналі Powerhell і просто швидко хочете дізнатися, який ви користувач, то введіть "ls ~", щоб зробити це. Як і у вищезгаданому плакаті, можуть бути винятки, і це, безумовно, не добре для сценаріїв, тому використовуйте приклад Едуарда Пурма в такому випадку.
MrBerta

-2

Якщо ви звикли до партії, ви можете зателефонувати

$user=$(cmd.exe /c echo %username%)

Це в основному викрадає вихід з того, що ви отримали, якби у вас був пакетний файл із просто "echo% username%".


1
Я покликаюсь на те, що: a) Ви - $(...)це зайве: $a = cmd.exe /c echo %username%працює, б) воно не є портативним, в) воно насправді не відповідає на питання, як це зробити в powerhell, він відповідає, як це зробити в dos, і це краще дати людині вудку, ніж дати їй рибу, наприклад powershell puts environment variables into $env, so %username% = $env:username.
kfsone

-2
  1. get-content "cm.txt"
  2. write-host "entr file name" $file = read-host get-content $file
  3. $content = get-content "cm.txt"
  4. $content = get-content "cn.txt" for each ($line in $count) {write-host $line}

$ content = get-content "cm.txt" ---- $ count = 0 ----- foreach ($ рядок у $ count) ---- {$ count = $ count + 1} ---- написати -host "у вас є багато таких рядків:" $ count
ammy

1. $ a = $ com1, $ com2 ------ запис-хост "введіть см імені" ---- $ c = readhost ----- запис-хост $ a [$ c-1] .користувач , write-host $ a [$ c-1] .password
ammy

$ com1 = new-object PSobject ----- $ com1 = $ com1 | add-member noteproperty -name username
-value

1
є причина, чому ви додаєте код як коментарі до власної відповіді?
aldr

1
чому ти не редагуєш свою відповідь і додаєш код замість того, щоб ділити його в таких коментарях, де ніхто його не зрозуміє?
aldr

-4

У моєму випадку мені потрібно було отримати ім’я користувача, щоб сценарій міг змінити шлях, тобто. c:\users\%username%\. Мені потрібно було запустити сценарій, змінивши шлях до робочого столу користувачів. Мені вдалося це зробити за допомогою зверху та в іншому місці за допомогою get-location аплета .

У вас може бути інший або навіть кращий спосіб зробити це, але це працювало для мене:

$Path = Get-Location

Set-Location $Path\Desktop

1
Ласкаво просимо до переповнення стека ! Це еквівалентно Set-Location Desktop. ( Get-Locationпросто повертає поточне розташування, яке Set-Location
явне
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.