$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
.