从命令提示符获取当前Windows域用户的显示名称

12

从命令提示符中,我怎样才能获取当前已登录的域用户的友好显示名称(即“John Doe”而不是“john.doe”)?

10个回答

12

这是我用批处理中的net命令和find命令来巧妙实现它的方法:

set command=net user "%USERNAME%" /domain | FIND /I "Full Name"

FOR /F "tokens=1 delims=" %%A in ('%command%') do SET fullNameText=%%A
set fullName=%fullNameText:Full Name=%
for /f "tokens=* delims= " %%a in ("%fullName%") do set fullName=%%a
第一行将我们想要执行的命令存储在一个变量中。它从环境变量中获取用户名,并将其传递给net user命令,以及/domain参数,告诉它从当前域中提取。然后它将该命令的结果,即有关当前用户的大量数据,管道传输到一个查找方法中,该方法将只提取我们想要的属性。找到的结果格式为“Full Name John Doe”。第二行将执行该命令并将结果放入变量fullNameText中。第三行将删除结果中的“Full Name”部分,并最终得到“ John Doe”。第四行使用for循环将结果中的所有前导空格都删除,最终你会在fullName变量中得到“John Doe”。

我们可以通过从命令行运行以下命令来查找计算机的域名。systeminfo | findstr /B /C:”Domain”我们可以使用环境变量“Userdomain”来查找已登录用户的域。其命令如下所示。echo %userdomain% - Sathish
1
太好了!在PowerShell中也可以工作:((net user $env:USERNAME /domain | Select-String "Full Name") -replace "Full Name","").Trim() - Anders Zommarin
我需要在第二行将%command%用引号括起来才能使其正常工作:('“%command%”') - elady
当您登录到与您的计算机连接的不同域帐户时,此命令无法正常工作,在AD林中。 - Matt Kerr

5
Lectrode的答案可以用一串字符串表示如下:
for /f "usebackq tokens=2,* delims= " %%a in (`net user "%USERNAME%" /domain ^| find /i "Full Name"`) do set FULLNAME=%%b

1
请注意,此内容格式化为.bat或.cmd脚本。这将无法像OP上面提问的那样“从命令提示符”中运行。 - Lectrode
1
for /f "usebackq tokens=2,* delims= " %a in (`net user "%USERNAME%" /domain ^| find /i "Full Name"`) do set FULLNAME=%b /// 只需将双 %% 更改为 %,即可在CMD中运行/// - kgimpel

4
这是skeletank的回答的一个衍生版本,稍微简洁一些,并且对我有用...(我尝试了skeletank的回答,但它没有按照原来的写法对我起作用,因此下面是我的答案。)
SET TNAME="net user %USERNAME% /domain| FIND /I "Full Name""
FOR /F "tokens=3,4 delims=, " %%A IN ('%TNAME%') DO SET DNAME=%%B %%A

然后,您可以在需要输出时使用“DNAME”,例如使用echo进行输出或使用“IF”语句进行验证。您可以翻转“%%B”和“%%A”令牌以返回到姓在前名在后的布局。这样可以节省skeletank原始响应中使用的额外工作量。
变量: -TNAME = 临时名称 -DNAME = 显示名称
-感谢skeletank

2
这应该是一种干净的方式,使用dsquery和dsget而不依赖于“全名”的输出,因为“全名”是与语言有关的,而“fn”似乎适用于不同语言版本的Windows。
for /F "tokens=2" %i in ('dsquery user -samid %username% ^| dsget user -L -fn ^| find "fn:"') DO @echo %i

dsget命令中的-L开关会输出"fn: USER",因此唯一需要做的是获取输出结果的第二列。 使用find "fn:"可以去除"dsget succeeded"的输出。

在cmd中执行win10结果为: username"') DO @echo i was unexpected at this time. 看起来是由于机器上不存在dsquery引起的。 - Matt Kerr
这是为命令行使用格式化的。Matt,请参考我的回答,了解命令行和脚本格式化之间的区别。此特定命令需要在运行该命令的计算机上安装RSAT。 - Lectrode

2

当前被接受的答案有4行代码,但实际上只需要一行就可以实现同样的功能:

for /f "tokens=2*" %n in ('net user "%USERNAME%" /domain^|FINDSTR /C:"Full Name"') do echo "%o"

即使“全名”由两个以上的部分组成,此命令也能正常运行。它在Windows工作站上“开箱即用”,不需要管理员权限。
注意:在批处理文件中使用时,请记得将%n%o更改为%%n%%o
该命令的说明如下:"tokens=2*表示它只关注第二个标记(分配给%n)和其后的所有字母(分配给下一个字母:%o)。
默认的分隔符delims是空格,因此我们不需要定义它,但如果需要手动定义,则应如下所示:"tokens=2* delims= "。因为空格是分隔符,它将忽略所有前导空格。
管道符号(|)通过脱字符(^)进行转义,告诉命令处理器最初忽略它。
我更喜欢使用FINDSTR而不是FIND,因为(在我的测试中)我发现它是更快的命令,这可能会在您经常使用它时产生影响。如果你喜欢的话,FINDSTR /C:"Full Name"可以很容易地替换为FIND "Full Name"

在win10中执行.bat文件时出现以下结果: USERNAME"Full Name"') 在此处是意外的。 - Matt Kerr
如果用户在与当前连接的域不同的域上(但仍在具有信任关系的AD森林中),则无法正常工作。请求将在域XXX.XXX.XXX的域控制器上处理。找不到用户名。键入NET HELPMSG 2221可获取更多帮助。 - Matt Kerr
OP的问题是要求使用“命令提示符”。我的回答格式如下。但是,如果您想将其用于.bat脚本,我会特别说明如何格式化它。请参见“注意事项”。 - Lectrode

0

0
我建立了一个批处理文件,通过使用 set p 和 goto 选择操作来快速执行一些事情。 我省略了不必要的部分。
@echo off

:begin

echo 5. Find who is on remote PC right now

echo.

set /p a=

IF %a%==5 (goto whoson)

REM Whos on
:whoson
set /p remotecomputername=Enter computer name to see the current user: 
wmic /node:%remotecomputername% computersystem get username
pause
goto begin

希望能对你有所帮助。


只有结果会进入无限循环提示,错误为“无效全局开关”。 - Matt Kerr

0
如果您需要人工使用它 - 意思是您不需要自動解析它,以便您獲得完整的名稱 - 您只需在命令提示符處鍵入net user <username> /domain,並閱讀“完整名稱”字段即可。
參考: 從命令行獲取詳細的域用戶信息

1
链接已损坏,并且当您登录到与您的计算机连接的不同域帐户时,此命令无法工作,在AD林中。 - Matt Kerr

0

从远程命令提示符(我通常使用PSexec.exe建立连接),然后只需键入“query user”即可。

enter image description here


需要更多的解释。 - Mathews Sunny

0

从skeletank简化版本

for /F "tokens=3,4 delims=, " %%A in ('net user "%USERNAME%" /domain ^|findstr /C:"Full Name"') do (set _FullName=%%B.%%A)

这将把Doe,John变成John.Doe


这似乎是为了执行相反的操作而制作的。 - Ethan McTague

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接