为什么$ env:username和[environment] :: username返回不同​​的用户?

nic*_*ick 4 powershell

是什么PowerShell的之间的区别$env:username,并[environment]::username他们为什么要返回的潜在用户不同?(我知道还有其他方法可以吸引当前用户)

一些背景:

我有一个Azure管道,在发布目标上运行PowerShell脚本。管道代理配置为在特定服务帐户下运行。该PowerShell脚本的一部分用于$env:username分配权限。但是,权限将分配给本地管理员帐户。如果我更改脚本以使用[environment]::username正确的服务帐户,则将为用户授予权限。

mkl*_*nt0 6

$env:USERNAME,虽然预定义以反映当前用户的用户名,但它是一个读写环境变量,与其他变量一样。

即使这样做显然是不明智的,也可以使用如下语句来$env:USERNAME = 'foo'更改USERNAME当前进程及其子进程的环境变量的值。

这意味着,如果USERNAME较早在同一会话或PowerShell的进程中修改了环境变量(可能是通过显式指定的启动环境),则它不再反映真实的username

虽然我不知道为什么在USERNAMEAzure Pipelines中环境变量为什么会与真实帐户有所不同,但Start-Process在进行-UseNewEnvironment切换时,PowerShell的cmdlet 的示例-无意-设置错误的值:由于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用于获取用户名
UserName属性。在Unix平台上,该属性包装对该getpwuid_r函数的调用。