代码之家  ›  专栏  ›  技术社区  ›  Thomas Bratt

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

  •  250
  • Thomas Bratt  · 技术社区  · 16 年前

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

    14 回复  |  直到 7 年前
        1
  •  310
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    我找到了它:

    $env:UserName
    

    还有:

    $env:UserDomain
    $env:ComputerName
    
        2
  •  146
  •   Mark Seemann    16 年前
    [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
    
        3
  •  101
  •   Jasper wontondon    14 年前

    $env:username 是最简单的方法

        4
  •  86
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    我认为总结和比较给出的答案是有价值的。

    如果您想访问 environment variable 以下内容:

    (简单/简短/难忘选项)

    • [Environment]::UserName ——托马斯布莱特
    • $env:username ---EOIN
    • whoami --@加勒克托

    如果您想访问 Windows access token :

    (更可靠的选项)

    • [System.Security.Principal.WindowsIdentity]::GetCurrent().Name ——马克西米安

    如果需要登录用户的名称

    (而不是运行PowerShell实例的用户的名称)

    • $(Get-WMIObject -class Win32_ComputerSystem | select username).username --@双风扇打开 this other forum

    比较

    @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"
    
        5
  •  47
  •   galaktor    14 年前

    我想加入 whoami 命令,这基本上是一个很好的别名 %USERDOMAIN%\%USERNAME% 在其他答案中提出。

    Write-Host "current user:"
    Write-Host $(whoami)
    
        6
  •  33
  •   WaffleSouffle    15 年前

    [Environment]::UserName 仅返回用户名。例如。 鲍勃 [System.Security.Principal.WindowsIdentity]::GetCurrent().Name 返回用户名,在适当的地方以其域作为前缀。例如。 哪里好\Bob

        7
  •  8
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

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

    我赞成马克·西曼的回答: [system.security.principal.windowsIdentity]::getcurrent().name

    但我不允许这样做。有了马克的答案,如果你只需要用户名,你可能需要解析它,因为在我的系统中,它会返回 hostname\username 在拥有域帐户的加入域的计算机上,它将返回 domain\username .

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

        8
  •  7
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    仅仅是在其他人的工作基础上:

    [String] ${stUserDomain},[String]  ${stUserAccount} = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.split("\")
    
        9
  •  3
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    既然 PowerShell Core (aka v6)已经发布,人们可能想编写跨平台脚本,这里的许多答案除了Windows以外都不起作用。

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

        10
  •  -1
  •   shaws    9 年前

    如果你习惯批量生产,你可以打电话给

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

    如果批处理文件只有“echo%username%”,这基本上会从中窃取输出。

        11
  •  -1
  •   Peter Mortensen Pieter Jan Bonestroo    7 年前

    我什么也没看到 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()
    
        12
  •  -1
  •   Kes tas    7 年前

    我发现最容易使用:cd$home\desktop\

    将带您到当前用户桌面

    在我的例子中,我需要检索用户名才能使脚本更改路径,即C:\users\%username%。我需要通过更改用户桌面的路径来启动脚本。在上面和其他地方的帮助下,我可以使用get location applet来完成这项工作。

    你也许还有其他更好的方法,但这对我很有用:

    $path=获取位置

    设置位置$path\desktop

        13
  •  -2
  •   jrider    7 年前
    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}
        14
  •  -4
  •   Thomas Baruchel    10 年前

    在我的例子中,我需要检索用户名以使脚本能够更改路径,即。 c:\users\%username%\ .我需要通过更改用户桌面的路径来启动脚本。在上面和其他地方的帮助下,我可以使用 获得位置 小程序。

    你也许还有其他更好的方法,但这对我很有用:

    $Path = Get-Location
    
    Set-Location $Path\Desktop