如何在Windows PowerShell中获取当前用户名?
当前回答
有时,Username属性在Win32_ComputerSystem中没有数据,即使有用户登录。对我来说有用的是使用quser并解析输出。这并不完美,但很有效。例如:
$quserdata = @()
$quserdata = quser
$userid = ($quserdata[1] -split ' ')[1]
$userid
注意:如果以登录用户的身份运行,quser会在输出中添加'>'符号。然后您需要删除该符号,但这主要用于作为系统或其他帐户运行的代码,而不是登录的帐户。
其他回答
在Windows上,你可以:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
美元的用户名
第二个用户名仅用于复制和粘贴时显示。
我认为总结和比较给出的答案是有价值的。
如果你想访问环境变量:
(容易/短/难忘的选项)
[环境]::用户名——@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"
我想要加入whoami命令,这基本上是一个很好的别名,用于执行%USERDOMAIN%\%USERNAME%,正如在其他答案中提出的那样。
Write-Host "current user:"
Write-Host $(whoami)
只是在其他人工作的基础上:
[String] ${stUserDomain},[String] ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
推荐文章
- 数组添加 vs +=
- 如何使用Windows命令行更改目录
- 如何在NERDTree中显示隐藏文件(以句点开始)?
- 如何使用命令行工具为Mac OS X创建一个漂亮的DMG ?
- Objective-C for Windows
- “注册”一个.exe,这样你就可以从Windows中的任何命令行运行它
- Windows批处理文件的隐藏特性
- PowerShell中用户输入的提示符
- 如何在bash脚本中检查文件名的扩展名?
- 目的!/ usr / bin / python3过程
- Windows递归grep命令行
- 如何从字符串执行任意本机命令?
- 如何创建自己的URL协议?(例如:/ /……)
- 在Windows批处理脚本中格式化日期和时间
- 映射一个网络驱动器供服务使用