如何在Windows PowerShell中获取当前用户名?


当前回答

我认为总结和比较给出的答案是有价值的。

如果你想访问环境变量:

(容易/短/难忘的选项)

[环境]::用户名——@ThomasBratt $env:用户名——@Eoin 哇——@galaktor


如果您想访问Windows访问令牌:

(更可靠的选择)

[System.Security.Principal.WindowsIdentity]:: GetCurrent()。名字——@MarkSeemann


如果您需要登录用户的名称

(而不是运行PowerShell实例的用户名)

$(获取wmiobject -class Win32_ComputerSystem |选择用户名)。用户名——@TwonOfAn在另一个论坛


比较

@Kevin Panko对@Mark Seemann的回答的评论涉及选择一个类别而不是另一个类别:

[Windows访问令牌方法]是最安全的答案,因为用户可以更改$env:USERNAME,但这样做不会被愚弄。

简而言之,环境变量选项更简洁,Windows访问令牌选项更可靠。

我不得不在一个PowerShell脚本中使用@Mark Seemann的Windows访问令牌方法,这个脚本是我从一个带有模拟功能的c#应用程序运行的。

c#应用程序是用我的用户帐户运行的,它以服务帐户的形式运行PowerShell脚本。由于我从c#运行PowerShell脚本的方式受到限制,PowerShell实例使用我的用户帐户的环境变量,即使它是作为服务帐户用户运行的。

在这个设置中,环境变量选项返回我的帐户名,Windows访问令牌选项返回服务帐户名(这是我想要的),登录用户选项返回我的帐户名。


测试

另外,如果您想自己比较选项,可以使用下面的脚本作为另一个用户运行脚本。您需要使用get - credential cmdlet来获取一个凭据对象,然后运行这个脚本,并将作为另一个用户运行的脚本作为参数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"

(你可能需要在noprofile前面加一个连字符,像这样)

Start-Process -Credential $cred -FilePath 'powershell.exe' -ArgumentList '-noprofile','-Command',"$script"

其他回答

在我的例子中,我需要检索用户名以使脚本更改路径,即。c: \ \ %的用户名% \用户。我需要通过更改用户桌面的路径来启动脚本。在上面和其他地方的帮助下,我可以通过使用get-location小程序来做到这一点。

你可能有另一种更好的方法,但这对我来说很管用:

$Path = Get-Location

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

美元的用户名

第二个用户名仅用于复制和粘贴时显示。

我找到了:

$env:UserName

还有:

$env:UserDomain
$env:ComputerName

如果你习惯批处理,你可以打电话

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

这基本上窃取了如果你有一个只有“echo %username%”的批处理文件的输出。

我认为总结和比较给出的答案是有价值的。

如果你想访问环境变量:

(容易/短/难忘的选项)

[环境]::用户名——@ThomasBratt $env:用户名——@Eoin 哇——@galaktor


如果您想访问Windows访问令牌:

(更可靠的选择)

[System.Security.Principal.WindowsIdentity]:: GetCurrent()。名字——@MarkSeemann


如果您需要登录用户的名称

(而不是运行PowerShell实例的用户名)

$(获取wmiobject -class Win32_ComputerSystem |选择用户名)。用户名——@TwonOfAn在另一个论坛


比较

@Kevin Panko对@Mark Seemann的回答的评论涉及选择一个类别而不是另一个类别:

[Windows访问令牌方法]是最安全的答案,因为用户可以更改$env:USERNAME,但这样做不会被愚弄。

简而言之,环境变量选项更简洁,Windows访问令牌选项更可靠。

我不得不在一个PowerShell脚本中使用@Mark Seemann的Windows访问令牌方法,这个脚本是我从一个带有模拟功能的c#应用程序运行的。

c#应用程序是用我的用户帐户运行的,它以服务帐户的形式运行PowerShell脚本。由于我从c#运行PowerShell脚本的方式受到限制,PowerShell实例使用我的用户帐户的环境变量,即使它是作为服务帐户用户运行的。

在这个设置中,环境变量选项返回我的帐户名,Windows访问令牌选项返回服务帐户名(这是我想要的),登录用户选项返回我的帐户名。


测试

另外,如果您想自己比较选项,可以使用下面的脚本作为另一个用户运行脚本。您需要使用get - credential cmdlet来获取一个凭据对象,然后运行这个脚本,并将作为另一个用户运行的脚本作为参数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"

(你可能需要在noprofile前面加一个连字符,像这样)

Start-Process -Credential $cred -FilePath 'powershell.exe' -ArgumentList '-noprofile','-Command',"$script"