#1 楼
我找到了它:$env:UserName
还有:
#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
评论
一种快速而肮脏的替代方法是$ 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