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

Tho*_*att 291 windows powershell scripting

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

Tho*_*att 362

我找到了:

$env:UserName
Run Code Online (Sandbox Code Playgroud)

还有:

$env:UserDomain
$env:ComputerName
Run Code Online (Sandbox Code Playgroud)

  • 感谢您回来回答您自己的问题.当有人自己找出答案并简单地回答:"没关系,得到它!"时,没有什么比这更令人沮丧的了. (12认同)
  • 一个快速而又脏的替代方法是`$ env:username`从相应的环境变量中检索用户名. (10认同)
  • 我认为$ env:username和[Environment] :: UserName都指向同一个东西. (7认同)
  • @MattDiTrolio这当然令人沮丧,但你认为没有什么比这更令人沮丧的了?! (4认同)
  • @CodeJockey没什么.不是历史.:) (4认同)
  • 这不是一种安全的方法。这是很容易规避的,如果有人弄乱了他们的环境变量,它可能会出错。使用 WindowsIdentity 调用来获取 Windows 的真实想法。 (2认同)
  • 要演示用户更改此环境变量的能力,请运行命令:`$env:UserName; $env:用户名 = "超级管理员"; $env:用户名`。对于方便的非关键用途来说,这可能是可以接受的,但不应用于安全或审核日志。 (2认同)

Mar*_*ann 164

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
Run Code Online (Sandbox Code Playgroud)

  • 这是最安全的答案,因为用户可以更改`$ env:USERNAME`,但这样做不会被愚弄. (14认同)
  • @KevinPanko是的,但是在你无法信任你的用户的时候,还需要提出其他更多的哲学问题.;-) (6认同)
  • 此方法包括域名和用户名.如果你有多个域名,那肯定是有益的. (4认同)

ale*_*ird 108

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

如果要访问环境变量:

(更简单/更短/更难忘的选择)

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

如果要访问Windows访问令牌:

(更可靠的选择)

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

如果需要登录用户的名称

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

  • $(Get-WMIObject -class Win32_ComputerSystem | select username).username- @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 Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)


小智 103

$env:username 是最简单的方法


gal*_*tor 50

我想抛出whoami命令,这%USERDOMAIN%\%USERNAME%在其他答案中提出的基本上是一个很好的别名.

Write-Host "current user:"
Write-Host $(whoami)
Run Code Online (Sandbox Code Playgroud)

  • 这适用于Windows 8.1 Pro和PowerShell 4. (6认同)
  • whoami赢得互动使用.它足够短,我可以记住如何输入它而不咨询SO :-) (3认同)
  • `$ env:USERNAME`可以由用户更改,但这样做不会被愚弄. (2认同)

Waf*_*fle 34

[Environment]::UserName只返回用户名.例如,bob [System.Security.Principal.WindowsIdentity]::GetCurrent().Name返回用户名,在适当的地方以其域为前缀.例如SOMEWHERENICE\bob


小智 10

我曾经使用$env:username过,但是一位同事指出它是一个环境变量,可以由用户更改,因此,如果你真的想获得当前用户的用户名,你就不应该相信它.

我赞成Mark Seemann的回答:[System.Security.Principal.WindowsIdentity] :: GetCurrent().Name

但我不被允许.有了Mark的答案,如果你只需要用户名,你可能需要解析它,因为在我的系统上,它返回hostname\username并且在域名加入的机器上将返回域名帐户domain\username.

我不会使用,whoami.exe因为它不存在于所有版本的Windows上,它是对另一个二进制文件的调用,可能会让一些安全团队适合.

  • 由于 OP 确实询问了 Windows-Powershell,这是有效的,但是 `[Environment]::UserName` 输入较少,独立于 `$env:username` 和跨平台:见 https://pastebin.com/GsfR6Hrp (2认同)

小智 8

只是建立在其他人的工作上:

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


Edo*_*oor 8

既然已经发布了PowerShell Core(aka v6),并且人们可能想编写跨平台脚本,那么这里的许多答案都不适用于Windows以外的任何其他软件。

[Environment]::UserName 如果您不想在代码中添加平台检测和特殊大小写,则似乎是在PowerShell Core支持的所有平台上获取当前用户名的最佳方法。


小智 5

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

$username

第二个 用户名是仅用于显示的目的只有当你复制和粘贴。