使用标准用户帐户在提升的脚本中获取登录用户名

Get logon username in elevated script with standard user account

在我的批处理脚本 运行 Windows 7 中,我有几个 IF 子句,例如:

IF "%USERNAME%"=="foo" GOTO bar

不幸的是,当我 运行 从上下文菜单中使用“运行 as administrator”提升此批处理脚本时,%USERNAME%始终是管理员的用户名,而不是当前活动登录用户的用户名。

这同样适用于提升的批处理脚本中的 whoami

QUERY USER 为我提供了当前登录的所有用户的列表,而不仅仅是我正在寻找的一个用户。

一个标准用户帐户,不像管理员帐户可以从用户组令牌提升到管理员组令牌,同时保持相同的用户环境,实际上加载管理员帐户环境时“运行作为管理员”被选中。

有没有办法获取当前活动的登录用户名而不是管理员用户名?

WMIC 计算机系统获取用户名

@echo off
setlocal

rem Get logon username without the leading "computername\" string.
set "user="

for /f "skip=1 tokens=1,* delims=\" %%A in (
    'wmic computersystem get username ^|findstr /r /v "^$"'
) do for %%C in (%%~B) do if not defined user set "user=%%~C"

echo "%user%"
pause

使用 for /f 选项 skip=1,因为第一行是不需要的 UserName header。用 \ 分隔,因为值将类似于 computername\username 并在第二个标记中获取余数。管道到 findstr 以忽略空行。第二个 for 循环将获得第一个没有白色 space 字符的值。

管道 wmic 输出到 powershell 比管道到 findstr 更好地清理输出测试,并且不需要使用第二个 for 循环。

@echo off
setlocal

rem Get logon username without the leading "computername\" string.
set "user="

for /f "skip=1 tokens=1,* delims=\" %%A in ('
    wmic computersystem get username ^|
    powershell -noprofile -command "$input.trim()"
') do set "user=%%~B"

echo "%user%"
pause

使用 command /? 获取更多帮助。代码中的大多数命令将在命令提示符处显示 /? 参数的帮助。

查询用户别名QUser

@echo off
setlocal

rem Get logon username.
set "user="

for /f %%A in ('quser^|findstr /b /c:">"') do set "user=%%~A"

if defined user if "%user:~0,1%" == ">" set "user=%user:~1%"

echo "%user%"
pause

quser中的前导>的别名query user)表示当前登录的用户名,而不是管理员的用户名。

在需要的地方使用 %user% 而不是 %username%

备注:

  • 由于 for /f 循环从 token=1 的默认选项获取用户名,如果用户名包含 space 或制表符,那么这将只获取字符在 space 或制表符之前。

  • 在 64 位 OS 上,quser.exe 存在于 System32 中,而不存在于 SysWOW64 中。 64 位 OS 上的 32 位 cmd.exe 可能无法识别为命令。

参考文献: