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

#1 楼

我找到了它:

$env:UserName


还有:

评论


一种快速而肮脏的替代方法是$ env:username,以从相应的环境变量中检索用户名。

–guillermooo
2010年1月21日,0:25

我认为$ env:username和[Environment] :: UserName都指向同一件事。

– Cephas
2010-1-21在22:39

感谢您回来回答您自己的问题。当有人自己弄清楚答案并简单地回答:“没关系,明白了!”时,没有什么更令人沮丧的了。

–马特·迪特罗里奥(Matt DiTrolio)
2012年5月3日13:45

@MattDiTrolio当然令人沮丧,但您认为没有什么比这更令人沮丧了!

–代码骑师
15年7月23日在15:18

@CodeJockey没事。从未有过的历史。 :)

–马特·迪特罗里奥(Matt DiTrolio)
15年7月23日在18:20

#2 楼

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


评论


这是最安全的答案,因为用户可以更改$ env:USERNAME,但是这样做不会被愚弄。

–凯文·潘科(Kevin Panko)
2014年4月23日在22:48

@KevinPanko是的,但是在您不能信任用户的时候,还有其他一些更哲学的问题需要提出。 ;-)

– jpaugh
16年1月18日在18:19

此方法包括域名和用户名。如果您有多个域,这绝对是有利的。

–瑞安·盖茨(Ryan Gates)
16年2月16日在17:00

可以正常工作。经过测试的网址保留。

– Marek Bar
18年7月6日在8:36

此外,这看起来也可以在PowerShell 6中工作,这意味着它与跨平台(.Net Standard)兼容。认为值得一提,因为我在看到名称空间时提出了质疑。

–死狗
19/12/3在23:41



#3 楼

我认为总结和比较给定的答案将很有价值。

如果要访问环境变量:

(更容易/更简短/更易记的选项)



[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-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"


评论


对于Mac OS X和Linux上的PowerShell 6,[Environment] :: UserName是最佳选择,因为它可以跨平台工作。 whoami似乎也可以工作,但要取决于平台上提供的whoami工具。

–弗洛里安·费尔德豪斯(Florian Feldhaus)
18年1月18日在17:19

对于Windows上的Powershell 6,除非我以管理员身份运行,否则$ env:USERNAME会产生SYSTEM,而[Environment] :: UserName]会以两种方式产生用户名。

– kfsone
18年7月24日在21:59

似乎Get-WmiObject方法不再在pwsh中起作用。甚至尝试导入兼容性模块和具有cmdlet的Microsoft.PowerShell.Management。知道发生了什么吗?

–not2qubit
19年2月4日在15:20

正确。出于性能原因,它早已迷惑于Get-CimInstance了……出于交叉兼容性原因,必须在V6中的WMI上使用CIM。如果看到带有GWMI的命令,请检查是否可以执行GCIM。

– Hicsy
19年4月4日,0:10

#4 楼

$env:username是最简单的方法

评论


您可以通过这种方式分配它,并建立目录,而不要建立目录。

– Droogans
2012年8月28日在18:28

#5 楼

我想输入whoami命令,基本上这是执行%USERDOMAIN%\%USERNAME%的一个很好的别名,如其他答案中所建议的那样。

评论


它在PS版本2上对我有效。您是说它已在PS3中删除吗? C:\> powershell Windows PowerShell版权所有(C)2009 Microsoft Corporation。版权所有。 PS C:\> whoami mydomain \ myusername

– Galaktor
2013年10月9日7:00



$ env:USERNAME可以由用户更改,但这不会被愚弄。

–凯文·潘科(Kevin Panko)
14年4月23日在22:51

whoami赢得互动使用。足够简短,我可以记住如何在不咨询SO的情况下键入它:-)

–伊恩·塞缪尔·麦克莱恩·艾尔德(Iain Samuel McLean Elder)
2014年8月22日14:56

在Nano Server中不是一回事。不要在脚本中使用它,而是要做正确的事情([System.Security.Principal.WindowsIdentity] :: GetCurrent()。Name)

–另一个用户
16-10-16在23:16

whoami是可执行文件。无法将其从PowerShell中删除。它可能会从Windows中删除,但是从非Nano Windows Server 2012起它仍然存在。

– jpmc26
17 Mar 10 '17在23:21



#6 楼

[Environment]::UserName仅返回用户名。例如。 bob
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name返回用户名,并在适当时添加其域前缀。例如。 SOMEWHERENICE \ bob

#7 楼

我过去曾经使用过$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和跨平台无关:请参见pastebin.com/GsfR6Hrp

– kfsone
18-09-23在20:30

#8 楼

现在,PowerShell Core(aka v6)已发布,并且人们可能想编写跨平台脚本,这里的许多答案都不适用于Windows以外的任何其他软件。
如果不想在代码中添加平台检测和特殊大小写,则是在PowerShell Core支持的所有平台上获取当前用户名的最佳方法。

#9 楼

只是在这里基于他人的工作:

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


#10 楼

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


$username

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

评论


$ fullname = Get-WMIObject -class Win32_ComputerSystem |选择对象-ExpandProperty用户名$ username = $ fullname.Replace(“ DOMAIN \”,“”)$ username

– clayton.nichols
19年6月6日在20:48



如果您希望用户登录到计算机而不是运行powershell会话的用户,则此方法效果最好。如果您以系统身份运行脚本,并且想知道什么用户登录到计算机,则env变量无济于事。

– Keets
8月4日23:20

#11 楼

我没有看到任何基于Add-Type的示例。这是直接从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()


评论


请解释这段代码在做什么,以及为什么它比较短的方法之一有用。

–本杰明·哈伯德(Benjamin Hubbard)
2015年4月9日14:17

@BenjaminHubbard这个问题并没有要求最短的方法,而是询问如何用powershell完成这一壮举。通过在dll内调用函数并使用Add-Type方法访问.NET,此技巧与其他示例不同。

–指节叉
15年7月24日在22:24

尽管这是一个新颖的代码块,但如果我知道它在做什么,那将很棒。可以用注释注释它吗?谢谢!

– jpaugh
16年1月18日在18:16

我几乎想投票,因为我认为该建议值得。但是代码存在一些缺陷:它引入了一个新的命名空间,它使用了一个魔术常数(64),该常数不是医生指定的值(应为UNLEN + 1,UNLEN为256),它忽略了可能返回的任何错误从GetUserName(通过它保留GetLastError,这是一个很好的方法),它不会清除字符串缓冲区;可能还有一些。就像其他人所说的那样,评论也很缺失。

– AntoineL
17年5月10日在9:07

#12 楼

如果您习惯进行批处理,则可以调用

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


这基本上会窃取如果您拥有仅带有“ echo%username”批处理文件的输出%“。

评论


我拒绝投票的原因是:a)您$(...)是多余的:$ a = cmd.exe / c echo%username%可以工作,b)它不可移植,c)实际上没有回答如何在powershell中进行操作,它回答了如何在dos中进行操作,并且给男人一根鱼竿比给他一条鱼更好,例如powershell将环境变量放入$ env,因此%username%= $ env:username。

– kfsone
18/09/23在20:21

#13 楼

我发现最容易使用:cd $ home \ Desktop \

将带您到当前用户桌面

对于我来说,我需要检索用户名以启用脚本改变路径,即c:\ users \%username%。我需要通过更改用户桌面的路径来启动脚本。通过使用get-location小程序,我能够在上层和其他地方的帮助下做到这一点。 br />
$ Path =获取位置

设置位置$ Path \ Desktop

评论


基于主目录进行任何假设都只能在非常特殊的条件下进行。

–劳尔·萨利纳斯-蒙塔古多
19年6月26日在7:15

如果您在Powershell终端中工作并且很快想知道您是什么用户,那么输入“ ls〜”应该可以解决问题。像上面的海报一样,可能会有例外,这对于脚本来说绝对不好,因此在这种情况下请使用Edouard Poor的示例。

– MrBerta
19-09-24在7:42

#14 楼


get-content "cm.txt"
write-host "entr file name" $file = read-host get-content $file
$content = get-content "cm.txt"
$content = get-content "cn.txt" for each ($line in $count) {write-host $line}


评论


1. $ a = $ com1,$ com2 ------写入主机“输入cm名称” ---- $ c = readhost -----写入主机$ a [$ c-1] .username ,写入主机$ a [$ c-1] .password

–ammy
18-10-8在20:43



$ com1 =新对象PSobject ----- $ com1 = $ com1 |添加成员noteproperty -name用户名-value 2016

–ammy
18-10-8在20:46

$ com1 |广告成员脚本方法已关闭{stop-computer}

–ammy
18-10-8在20:50

是否有理由将代码添加为自己的答案作为注释?

– aldr
'18 -10-8在21:00

为什么不编辑答案并添加代码,而不是将其拆分成没有人会理解的注释?

– aldr
18-10-8在21:04

#15 楼

就我而言,我需要检索用户名以使脚本能够更改路径,即。 c:\users\%username%\。我需要通过更改用户桌面的路径来启动脚本。通过使用get-location小程序,我可以在上面和其他地方的帮助下做到这一点。 br />
$Path = Get-Location

Set-Location $Path\Desktop


评论


欢迎使用Stack Overflow!这等效于“设置位置桌面”。 (Get-Location仅返回当前位置,对于具有相对路径的Set-Location是隐式的。)

– jpaugh
16 Jan 18'在18:11