如何在Windows PowerShell中获取当前用户名?
我找到了:
$env:UserName
还有:
$env:UserDomain $env:ComputerName
在Windows上,你可以:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
[Environment]::UserName只返回用户名。例如< >强鲍勃 [System.Security.Principal.WindowsIdentity]::GetCurrent().Name返回用户名,在适当的地方加上域前缀。例如SOMEWHERENICE \鲍勃 < / p >
[Environment]::UserName
$env:username是最简单的方法
$env:username
我想要加入显示本用户信息命令,这基本上是一个很好的别名,用于执行其他答案中提出的%USERDOMAIN%\%USERNAME%。
%USERDOMAIN%\%USERNAME%
Write-Host "current user:" Write-Host $(whoami)
我没有看到任何基于添加类型的例子。这里是一个使用GetUserName直接从advapi32.dll。
$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()
我认为总结和比较给出的答案是有价值的。
(容易/短/难忘的选项)
whoami
(更可靠的选择)
(而不是运行PowerShell实例的用户名)
$(Get-WMIObject -class Win32_ComputerSystem | select username).username
@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"
在我的例子中,我需要检索用户名以使脚本更改路径,即。c:\users\%username%\。我需要通过更改用户桌面的路径来启动脚本。在上面和其他地方的帮助下,我能够通过使用get-location applet来做到这一点。
c:\users\%username%\
你可能有另一种更好的方法,但这对我来说很管用:
$Path = Get-Location Set-Location $Path\Desktop
只是在其他人工作的基础上:
[String] ${stUserDomain},[String] ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
我过去使用过$env:username,但一位同事指出它是一个环境变量,可以由用户更改,因此,如果你真的想获得当前用户的用户名,你不应该相信它。
但是我不被允许。有了Mark的答案,如果你只需要用户名,你可能不得不解析出来,因为在我的系统上,它返回hostname\username,在域加入的机器上,它将返回domain\username。
hostname\username
domain\username
我不会使用whoami.exe,因为它并不存在于所有版本的Windows上,而且它是对另一个二进制文件的调用,可能会给一些安全团队带来麻烦。
whoami.exe
如果你习惯批处理,你可以打电话
$user=$(cmd.exe /c echo %username%)
这基本上窃取了如果你有一个只有“echo %username%”的批处理文件的输出。
现在PowerShell核心(又名v6)已经发布了,人们可能想要编写跨平台脚本,这里的许多答案将不能在Windows以外的任何地方工作。
[Environment]::UserName似乎是在PowerShell Core支持的所有平台上获得当前用户名的最佳方法,如果你不想在你的代码中添加平台检测和特殊的外壳。
我发现最容易使用的:cd $home\Desktop\
在我的例子中,我需要检索用户名以使脚本更改路径,即。c: \ \ %的用户名%的用户。我需要通过更改用户桌面的路径来启动脚本。在上面和其他地方的帮助下,我可以通过使用get-location小程序来做到这一点。
$Path =获取位置
Set-Location \ $ Path桌面
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]
$username
第二个 用户名仅用于复制和粘贴时的显示目的。