使用标准用户帐户在提升的脚本中获取登录用户名
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
可能无法识别为命令。
参考文献:
在我的批处理脚本 运行 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
可能无法识别为命令。
参考文献: