Почему $ env: username и [environment] :: username возвращают разных пользователей? - PullRequest
4 голосов
/ 25 октября 2019

В чем разница между $env:username и [environment]::username и в PowerShell, почему они потенциально могут вернуть разных пользователей ? (Я понимаю, что есть и другие способы получить текущего пользователя)

Некоторые сведения:

У меня есть конвейер Azure, который запускает сценарий PowerShell для цели выпуска,Агент конвейера настроен для работы под определенной учетной записью службы. Часть этого скрипта PowerShell использует $env:username для назначения разрешений. Однако вместо этого разрешения назначаются локальной учетной записи администратора. Если я изменю сценарий на использование [environment]::username, соответствующему пользователю учетной записи службы будут предоставлены разрешения.

Ответы [ 2 ]

6 голосов
/ 26 октября 2019

$env:USERNAME, в то время как предопределено для отражения имени пользователя текущего пользователя, является переменной окружения read-write , как и любая другая.

Даже если онаочевидно, что это нежелательно, такой оператор, как $env:USERNAME = 'foo', изменяет значение переменной среды USERNAME для текущего процесса, а также его дочерних процессов.

Это означает, что если переменная среды USERNAME был изменен ранее в том же сеансе или в процессе родительского PowerShell, возможно, через явно заданную среду запуска, он больше не отражает истинное имя пользователя .

Хотя я этого не делаюзнать, почему переменная окружения USERNAME будет отличаться от реальной учетной записи в случае конвейеров Azure, примером - непреднамеренного - неправильного задания значения является командлет PowerShell Start-Process при наличии переключателя -UseNewEnvironment: из-за ошибки вPowerShell Core 7.0.0-preview.5 / Windows PowerShell v5.1, $env:USERNAME неожиданно всегда отражает SYSTEM, независимо от действияПользовательская учетная запись - см. этот выпуск GitHub .

В отличие от этого [Environment]::UserName использует другой метод получения имени пользователя текущего пользователя, который не зависит отзначение $env:USERNAME и всегда отражает истинное имя пользователя [1] .

Короче: Только [Environment]::UserName достоверно отражает имя пользователя текущей учетной записи пользователя.


[1] Из связанных документов : «В Windows свойство UserName переносит вызов функции Windows GetUserName. Учетные данные учетной записи домена для пользователя форматируются как имя домена пользователя, символ \ и имя пользователя. Используйте свойство UserDomainName для получения имени домена пользователя и свойство UserName для получения имени пользователя.
На платформах Unix свойство UserName переносит вызов функции getpwuid_r.

0 голосов
/ 26 октября 2019

$ env: просматривает ваши переменные среды. Переменная, на которую вы смотрите - имя пользователя - по умолчанию установлена ​​на локальное имя пользователя. Но это не обязательно.

[Environment] - это вызов класса System.Environment в .NET Framework. Этот класс имеет свойство с именем UserName, которое содержит имя пользователя, которое зарегистрировано на компьютере.

Подобные имена, но очень разные вещи. Например, вы можете получить инструкцию пути по $ env: Path или вызвать [Environment] :: Version, чтобы получить версию .NET Framework.

Обратите внимание, что в этом примере я намеренно перепутал локальную переменную средыдо запуска PowerShell, чтобы дать неправильное имя пользователя.

C:\WINDOWS\system32>echo %username%
mspow

C:\WINDOWS\system32>set username=bob

C:\WINDOWS\system32>echo %username%
bob

C:\WINDOWS\system32>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\WINDOWS\system32> echo $env:username
bob
PS C:\WINDOWS\system32> [Environment]::Username
mspow
PS C:\WINDOWS\system32> echo $env:ProgramFiles
C:\Program Files
PS C:\WINDOWS\system32> echo $env:path
C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\dotnet\;C:\Users\mspow\AppData\Local\Microsoft\WindowsApps
PS C:\WINDOWS\system32> [Environment]::Version

Major  Minor  Build  Revision
-----  -----  -----  --------
4      0      30319  42000

Вы можете просмотреть все доступные переменные среды, используя

Get-Item -Path Env:

Единственный известный мне способ увидеть всеМетоды и свойства для [Среда] - это ссылка на сайт MSDN. Get-Member не работает над этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...