繁体   English   中英

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

[英]How do I get the current username in Windows PowerShell?

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

我找到了:

$env:UserName

还有:

$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name

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

如果要访问环境变量

(更简单/更短/令人难忘的选项)

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

$env:username是最简单的方法

我想加入whoami命令,它基本上是一个很好的别名,用于按照其他答案中的建议执行%USERDOMAIN%\\%USERNAME%

Write-Host "current user:"
Write-Host $(whoami)

[Environment]::UserName只返回用户名。 例如bob [System.Security.Principal.WindowsIdentity]::GetCurrent().Name返回用户名,在适当的地方以其域为前缀。 例如,某处\\鲍勃

现在PowerShell Core (又名 v6)已经发布,人们可能想要编写跨平台脚本,这里的许多答案在 Windows 以外的任何东西上都不起作用。

如果您不想在代码中添加平台检测和特殊大小写, [Environment]::UserName似乎是在 PowerShell Core 支持的所有平台上获取当前用户名的最佳方式。

我过去使用过$env:username ,但一位同事指出它是一个环境变量,可以由用户更改,因此,如果您真的想获取当前用户的用户名,则不应信任它。

我赞成 Mark Seemann 的回答:[System.Security.Principal.WindowsIdentity]::GetCurrent().Name

但我不允许。 根据 Mark 的回答,如果您只需要用户名,您可能需要解析它,因为在我的系统上,它返回hostname\\username而在具有域帐户的域加入机器上,它将返回domain\\username

我不会使用whoami.exe因为它并不存在于所有版本的 Windows 上,而且它是对另一个二进制文件的调用,可能会让一些安全团队适应。

只是建立在其他人的工作基础上:

[String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
$username=( ( Get-WMIObject -class Win32_ComputerSystem | Select-Object -ExpandProperty username ) -split '\\' )[1]

$username

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

我没有看到任何基于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()

有时,即使有用户登录,用户名属性在 Win32_ComputerSystem 中也没有数据。对我有用的是使用quser并解析 output。它并不完美,但它有效。 例如:

$quserdata = @()
$quserdata = quser
$userid = ($quserdata[1] -split ' ')[1]
$userid 

注意:如果这是作为登录用户运行的,则quser会在 output 中添加“>”符号。然后您需要删除该符号,但大多数情况下,代码运行时需要以系统或其他帐户运行代码。即已登录。

如果你习惯批处理,你可以调用

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

如果您有一个只有“echo %username%”的批处理文件,这基本上会窃取您将获得的输出。

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

我觉得最容易使用: cd $home\\Desktop\\

将带您到当前用户桌面

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

您可能有另一种甚至更好的方法来做到这一点,但这对我有用:

$Path = 获取位置

设置位置 $Path\\Desktop

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

您可能有另一种甚至更好的方法来做到这一点,但这对我有用:

$Path = Get-Location

Set-Location $Path\Desktop

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM