Answers:
我找到了:
$env:UserName
还有:
$env:UserDomain
$env:ComputerName
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$env:USERNAME
用户可以更改它,但是这样做不会被愚弄。
我认为总结和比较给出的答案将很有价值。
(更容易/更简短/值得纪念的选项)
[Environment]::UserName
-@ThomasBratt$env:username
-@伊恩whoami
-@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访问令牌选项更加可靠。
我必须在具有模拟功能的C#应用程序中运行的PowerShell脚本中使用@Mark Seemann的Windows访问令牌方法。
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"
[Environment]::UserName
是最佳选择,因为它可以跨平台工作。whoami
似乎也可以,但是取决于whoami
平台上可用的工具。
$env:USERNAME
会生成SYSTEM
,而会[Environment]::UserName]
以两种方式生成用户名。
Get-WmiObject
方法在pwsh中不再起作用。甚至尝试导入兼容性模块Microsoft.PowerShell.Management
,并且该命令具有cmdlet。知道发生了什么吗?
我想输入whoami命令,该命令基本上是%USERDOMAIN%\%USERNAME%
其他答案中所建议的一个很好的别名。
Write-Host "current user:"
Write-Host $(whoami)
$env:USERNAME
可以由用户更改,但是这样做不会被愚弄。
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
)
whoami
是可执行文件。无法将其从PowerShell中删除。它可能从Windows中删除,但它仍然存在非纳米的Windows Server 2012的
我用过了 $env:username
过,但是一位同事指出这是一个环境变量,用户可以更改它,因此,如果您确实想获取当前用户的用户名,则不应信任它。
我赞成Mark Seemann的回答:[System.Security.Principal.WindowsIdentity] :: GetCurrent()。Name
但是我不被允许。用Mark的答案,如果只需要用户名,则可能必须解析它,因为在我的系统上,它会返回,hostname\username
而在具有域帐户的加入域的计算机上,它将返回domain\username
。
我不会使用whoami.exe
它,因为它并非在所有版本的Windows上都存在,并且它是对另一个二进制文件的调用,可能会使某些安全团队感到满意。
[Environment]::UserName
键入较少,独立$env:username
且跨平台的:请参阅pastebin.com/GsfR6Hrp
既然已经发布了PowerShell Core(aka v6),并且人们可能想编写跨平台脚本,那么这里的许多答案都不适用于Windows以外的任何其他软件。
[Environment]::UserName
如果您不想在代码中添加平台检测和特殊大小写,则似乎是在PowerShell Core支持的所有平台上获取当前用户名的最佳方法。
$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()
UNLEN+1
,UNLEN
为256),它忽略了可能从GetUserName返回的任何错误(通过它保留了GetLastError,这是一个好主意),它不会清理字符串缓冲区;可能还有一些。正如其他人所说的那样,评论也很缺失。
我发现最容易使用:cd $ home \ Desktop \
就我而言,我需要检索用户名以使脚本能够更改路径,即。c:\ users \%username%。我需要通过更改用户桌面的路径来启动脚本。在上面和其他地方的帮助下,我可以使用get-location小程序来做到这一点。
您可能有另一种甚至更好的方法,但这对我有用:
$ Path =获取位置
设置位置$ Path \ Desktop
如果您习惯批量处理,可以致电
$user=$(cmd.exe /c echo %username%)
如果您只具有一个“ echo%username%”批处理文件,这基本上会从您得到的输出中窃取输出。
$(...)
是多余的:$a = cmd.exe /c echo %username%
工作,b)它不是便携式的,c)它实际上并没有回答如何在powershell中做到这一点,而是回答了如何在dos中做到这一点,并且给男人一根鱼竿比给他一条鱼更好powershell puts environment variables into $env, so %username% = $env:username
。
get-content "cm.txt"
write-host "entr file name"
$file = read-host
get-content $file
$content = get-content "cm.txt"
$content = get-content "cn.txt"
for each ($line in $count)
{write-host $line}
就我而言,我需要检索用户名以使脚本能够更改路径,即。c:\users\%username%\
。我需要通过更改用户桌面的路径来启动脚本。在上面和其他地方的帮助下,我可以使用get-location小程序来做到这一点。
您可能有另一种甚至更好的方法,但这对我有用:
$Path = Get-Location
Set-Location $Path\Desktop
$env:username
从相应的环境变量中检索用户名。