如何在 Windows 环境中查找当前用户?

在运行命令行脚本时,是否可以获得当前用户的名称?

412798 次浏览

您可以使用用户名变量: %USERNAME%

它应该是在 %USERNAME%。显然,这可以很容易欺骗,所以不要依赖于它的安全。

有用的提示: 在命令提示符中键入 set将列出所有环境变量。

用户名:

echo %USERNAME%

域名:

echo %USERDOMAIN%

通过在命令提示符下运行命令 set,您可以获得环境变量的完整列表。

Windows 没有一些更有用的 Unix 小脚本实用程序,比如 /哇塞SedAWK,这总是让我很恼火。无论如何,如果你想要一些简单易行的东西,使用 Visual Studio Express 并编译以下代码:

#include <windows.h>
#include <stdio.h>


int main(int argc, char **argv) {
printf("%s", GetUserName());
}

在你的批处理文件中使用它。

% USERNAME% 将为您提供当前正在运行的进程的用户名。根据您运行批处理文件的方式,这不一定与当前用户的名称相同。例如,您可能正在通过计划任务、服务等运行批处理文件。

下面是一种更可靠的获取当前登录用户的用户名的方法,它可以通过刮取启动 Explorer.exe 任务的用户的名称:

for /f "TOKENS=1,2,*" %%a in ('tasklist /FI "IMAGENAME eq explorer.exe" /FO LIST /V') do if /i "%%a %%b"=="User Name:" set _currdomain_user=%%c
for /f "TOKENS=1,2 DELIMS=\" %%a in ("%_currdomain_user%") do set _currdomain=%%a & set _curruser=%%b

我在编写用于测试的批处理文件时使用这种方法。

echo %userdomain%\%username%

因为如果需要身份验证,您必须将密码包含在纯文本中,所以我只会在完全私有的环境中使用它,其他用户无法查看它,或者如果用户看到密码将不会承担任何后果。

希望这能帮到别人。

在标准上下文中,每个连接的用户都拥有一个 glober.exe 进程: 命令[ tasklist/V | find“ Explorer”]返回一行,其中包含 glober.exe 进程所有者的进程,通过一个经过调整的正则表达式,可以获得所需的值。这也可以在 Windows7下完美运行。

在极少数情况下,Explorer.exe 被另一个程序替换,可以调整 find 筛选器来匹配这种情况。如果命令返回一个空行,那么很可能没有用户登录。在 Windows 7中也可以运行[ query session | find“ >”]。

只需在命令提示符中使用此命令

C:\> whoami

在批处理和其他 Windows 环境中,%USERNAME% 是正确答案。

另一种选择是使用 %USERPROFILE%获取用户的路径,如 C:\Users\username

至于找到最好的 BlueBearr 响应(而我,正在运行我的批处理脚本,例如。系统权限)我必须添加一些东西到它。 因为在我的 Windows 语言版本(波兰语)中,要被“%% a%% b”= = “ User Name:”捕捉到的行将变得非常复杂(它在我的语言中包含一些发音符号) ,我跳过前7行,在第8行进行操作。

@for /f "SKIP= 7 TOKENS=3,4 DELIMS=\ " %%G in ('tasklist /FI "IMAGENAME eq explorer.exe" /FO LIST /V') do @IF %%G==%COMPUTERNAME% set _currdomain_user=%%H

在大多数情况下,% USERNAME% 变量将是您想要的。

echo %USERNAME%

但是,如果您正在运行升级的 cmd shell,那么% USERNAME% 将报告管理员名称,而不是您自己的用户名。如果你想知道后者,那就跑吧:

for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u

答案取决于您使用的是哪种“命令行脚本”语言。

CMD

在旧的 cmd.exe命令提示符或 .bat.cmd脚本中,可以使用以下命令:

%USERNAME%-获取用户名。

%USERDOMAIN%-获取用户的域。

PowerShell

在 PowerShell 命令提示符或 .ps1.psm1脚本中,可以使用以下命令:

[System.Security.Principal.WindowsIdentity]::GetCurrent().Name-提供完全限定的用户名(如域用户名)。这也是最安全的方法,因为它不能像下面的其他 $Env变量一样被用户重写。

$Env:Username-获取用户名。

$Env:UserDomain-获取用户的域。

$Env:ComputerName-获取计算机的名称。

任何壳牌

whoami-以“域用户名”的格式获取用户的域和用户名。

这也适用于 Unix 系统,而不仅仅是 Windows,所以这是一个很好的跨平台解决方案。

这是 username 变量和 whoami 命令之间的主要区别:

C:\Users\user.name>echo %username%
user.name


C:\Users\user.name>whoami
domain\user.name


DOMAIN = bios name of the domain (not fqdn)

通过 powershell (file.ps1) 我使用以下方法

$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name

它以“ DomainUsername”格式返回用户的名称。 如果你只是想要用户名,只要写

$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.Split("\")[1]

它的优点是可以在 Windows10 Windows8服务器2016上运行。据我所知,还有其他的操作系统,比如 Win7等等(没有更老的) 。是的,通过批,你可以简单地使用

 $username = &whoami

只要在命令提示符中键入 whoami,就会得到当前的用户名。