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


159

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



@PeterMortensen,我认为线程与这一线程没有太大关系。一种是使用.NET,另一种是使用cmd API。除了他们都想要相同的信息之外,当然还有大量其他的API也可以执行类似的操作
KyleMit

Answers:


202

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


90

用户名:

echo %USERNAME%

域名:

echo %USERDOMAIN%

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


有关所有环境变量的额外信息,使它成为了一个很好的扩展答案。
bballdave025

63

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

C:\> whoami

这是一个很好的答案,但有一些警告。如果我进入whoami,我会得到desktop-machine\bballdave025。通过以下两个部分可以看出:1)echo %USERNAME%,结果bballdave025;2)echo %USERDOMAIN%,结果DESKTOP-MACHINE。我猜一个人可能说“完整的用户名”可通过echo %USERDOMAIN%\%USERNAME%(此结果DESKTOP-MACHINE\bballdave025,匹配whoami大小写,忽略大小写),甚至通过echo %USERNAME%@%USERDOMAIN%result来使用bballdave025@DESKTOP-MACHINE这完全取决于用户(对我们而言,OP)的需求,即域部分是否重要。
bballdave025

46

应该在%USERNAME%。显然,这很容易被欺骗,因此请不要依赖于它的安全性。

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


2
您的'net config工作站| 找到“用户名”的注释非常有用。它本来应该是一个答案,而不仅仅是一个评论
Alpay

17

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

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


6

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

Cmd

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

%USERNAME% -仅获取用户名。

%USERDOMAIN% -获取用户的域。

电源外壳

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

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

$Env:Username -仅获取用户名。

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

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


这是一个很好的答案,因为此问题取决于“外壳”。Windows可以使用许多外壳程序。不只是CMD。如今,大多数人都已经转向Powershell,并且还有其他人。 stackoverflow.com/questions/17349022/…–
G_Style

5

%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

4

我使用这种方法编写批处理文件进行测试。

echo %userdomain%\%username%

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

希望这可以帮助某人。


4

Windows为何没有一些更有用的Unix小型脚本实用程序,例如who / whoamisedAWK,这总是让我感到烦恼。无论如何,如果您希望万无一失,请获取Visual Studio Express并编译以下内容:

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

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

只需在批处理文件中使用它即可。


是的,拥有内置的设备会很好。
地理

8
我同意sed和awk会很有用,但这可以使您获得50%的访问net config Workstation | find "User name"
权限

9
whoami从Windows Vista开始可用。
乔伊(Joey)

2
的确,Vista附带了whoami实用程序。对于XP,它在SP2支持工具中,对于W2K,在资源工具箱中。
RealHowTo

4

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

echo %USERNAME%

但是,如果您正在运行提升的cmd Shell,则%USERNAME%将报告管理员名称,而不是您自己的用户名。如果您想了解后者,请运行:

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

1

这是用户名变量和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)

0

在标准情况下,每个连接的用户都拥有一个explorer.exe进程:命令[tasklist / V | find“ explorer”]返回一行,其中包含explorer.exe进程所有者的代码,并带有经过修改的正则表达式,可以获取所需的值。这也可以在Windows 7下完美运行。

在极少数情况下,explorer.exe被另一个程序替换,可以修改查找过滤器以匹配这种情况。如果命令返回空行,则很可能没有用户登录。在Windows 7中,也可以运行[query session | find“>”]。


0

至于发现BlueBearr响应最好(在我以例如SYSTEM权限运行批处理脚本时),我必须添加一些内容。因为在我的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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.