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

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

find了:

$env:UserName 

还有:

 $env:UserDomain $env:ComputerName 
 [System.Security.Principal.WindowsIdentity]::GetCurrent().Name 

$env:username是最简单的方法

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

如果你想访问环境variables

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

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

如果你想访问Windows访问令牌

(更可靠的select)

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

如果你想要login用户的名字

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

  • $(Get-WMIObject -class Win32_ComputerSystem | select username).username – @TwonOfAn在这个其他论坛

对照

@Kevin Panko对@Mark Seemann的回答的评论涉及select其中一个类别:

[windows访问令牌方法]是最安全的答案,因为$ env:USERNAME可以被用户修改,但是这样做不会被这样做所迷惑。

简而言之, 环境variables选项更简洁,并且windows访问令牌选项更可靠。

我不得不在使用模拟的C#应用​​程序中运行的PowerShell脚本中使用@Mark Seemann的Windows访问令牌方法。 C#应用程序使用我的用户帐户运行,它将PowerShell脚本作为服务帐户运行。 由于我从C#运行PowerShell脚本的方式受到限制,PowerShell实例使用我的用户帐户的环境variables,即使它作为服务帐户用户运行。 在这个设置中,环境variables选项返回我的账户名称,windows访问令牌选项返回服务账户名称(这是我想要的),login用户选项返回我的账户名称。


testing

另外,如果您想亲自比较选项,则可以使用以下脚本作为另一个用户来运行脚本。 您需要使用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" 

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

 Write-Host "current user:" Write-Host $(whoami) 

[Environment]::UserName只返回用户名。 例如bob [System.Security.Principal.WindowsIdentity]::GetCurrent().Name返回用户名,在适当的时候用它的域作为前缀。 例如SOMEWHERENICE \ bob

只是build立在这里的其他人的工作:

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

并感谢您的信息,因为我喜欢从权威来源简单地获取数据。

我曾经使用过$ env:username,但是一位同事指出,这是一个环境variables,可以由用户改变,所以如果你真的想获得当前用户的用户名,就不要相信它。

我会赞成马克·西曼的回答:

 [System.Security.Principal.WindowsIdentity]::GetCurrent().Name 

但我不被允许。 用马克的答案,如果你只需要用户名,你可能不得不parsing它,因为在我的系统上,它返回主机名\用户名和域join机器与域帐户它将返回域\用户名。

我不会使用whoami.exe,因为它没有出现在所有版本的Windows上,而且它是对另一个二进制文件的调用,可能会给一些安全团队带来帮助。

如果您习惯于批量处理,则可以致电

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

如果你有一个只有“echo%username%”的batch file,这基本上会窃取你将得到的输出。

我没有看到任何基于添加types的示例,这里是直接从advapi32.dll使用GetUserName。

 $sig = @' [DllImport("advapi32.dll", SetLastError = true)] public static extern bool GetUserName(System.Text.StringBuilder sb, ref Int32 length); '@ Add-Type -MemberDefinition $sig -Namespace Advapi32 -Name Util $size = 64 $str = New-Object System.Text.StringBuilder -ArgumentList $size [Advapi32.util]::GetUserName($str,[ref]$size) |Out-Null $str.ToString() 

在我的情况下,我需要检索用户名,以使脚本来改变path,即。 c:\users\%username%\ 我需要通过更改用户桌面的path来启动脚本。 通过使用get-location applet,我可以在上面和其他地方的帮助下做到这一点。

你可能有另一个,甚至更好的方式来做到这一点,但这对我有效:

 $Path = Get-Location Set-Location $Path\Desktop