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)
Mar*_*ann 164
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
Run Code Online (Sandbox Code Playgroud)
ale*_*ird 108
我认为总结和比较给出的答案是有价值的.
(更简单/更短/更难忘的选择)
[Environment]::UserName
- @ThomasBratt$env:username
- @Eoinwhoami
- @galaktor(更可靠的选择)
[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)
gal*_*tor 50
我想抛出whoami命令,这%USERDOMAIN%\%USERNAME%
在其他答案中提出的基本上是一个很好的别名.
Write-Host "current user:"
Write-Host $(whoami)
Run Code Online (Sandbox Code Playgroud)
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上,它是对另一个二进制文件的调用,可能会让一些安全团队适合.
小智 8
只是建立在其他人的工作上:
[String] ${stUserDomain},[String] ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
Run Code Online (Sandbox Code Playgroud)
既然已经发布了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
在第二个 用户名是仅用于显示的目的只有当你复制和粘贴。
归档时间: |
|
查看次数: |
500918 次 |
最近记录: |