我正在尝试编写一个脚本,用于跟踪所有瘦客户端用户的登录/注销时间,并将其写入服务器上的文本文件。我将在任务计划程序中设置一个任务,运行一个批处理文件,该文件每次用户登录/注销时都会写入文本文件。要写入 C:/ 中的文件,必须以管理员身份运行该脚本。这可以通过在任务计划程序中选择“以最高权限运行”并确保它在管理员帐户下运行来实现。
但是,我相信当我使用 %USERPROFILE% 命令时,它将返回管理员的用户名,而不是刚刚登录/退出的用户的用户名。有没有办法以管理员权限运行脚本,但有一些命令来获取刚刚登录/退出的用户,从而触发任务?
答案1
这实际上比看起来要容易一些。我们可以做的是抓取当前正在运行的任务(在本例中为 explorer.exe)并提取当前正在运行的用户信息,以便稍后用作变量。
SETLOCAL EnableDelayedExpansion
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
通过首先执行此操作,您现在可以使用%_curruser%
来生成用户名和%_currdomain%
域。
测试:
打开 CMDadmin
并逐行输入上述代码。现在,输入@echo %_curruser%
它将打印当前用户的用户名。
从现在开始您可以使用它来代替%userprofile%
。
例如,完成上述操作后,您可以这样做:
net user %_curruser% | findstr /B /C:"Last logon" >> C:\temp\%_curruser%.txt
这将从以管理员身份运行的 shell 打印当前登录的用户、日期和时间戳到 C:\ 驱动器,并在每次运行时使用登录用户独有的文件名不断附加数据。
答案2
感谢 Narzard 提供的原始代码,我只是想列出更正并附上批处理文件版本。
如果逐行粘贴,只需将“%User %Name:”更改为“User Name:”。完整代码为:
setlocal EnableDelayedExpansion
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 off
setlocal EnableDelayedExpansion
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 Current Domain User: %_currdomain_user%
echo Current Domain: %_currdomain%
echo Current User: %_curruser%
rem Return to CMD prompt.
cmd /k
两者运行后均允许您使用 %_currdomain_user%、%_currdomain%、%_curruser%。已在 Windows 10 和 11 中测试。