【问题标题】:Get currently logged on user on Windows获取当前在 Windows 上登录的用户
【发布时间】:2024-01-21 03:19:01
【问题描述】:

示例:我以用户 TestUser 的身份登录。我将以名为 AdminUser 的管理员身份从该用户运行命令行。

是否可以从这个命令行确定当前登录的TestUser的名字?

我已经有计划任务始终以 AdminUser 身份运行,但在其操作(批处理文件)中,我需要指定当前登录用户的名称。

有什么想法吗?

【问题讨论】:

  • 你能解释一下“当前登录的用户”是什么意思吗?您是否将其限制在控制台上?远程桌面连接算不算?如果这是服务器操作系统,您将如何在 RDP 客户端之间进行选择?
  • 不确定,因为目前无法尝试,但tasklist /v |find "explorer.exe" 有帮助吗?

标签: windows batch-file scripting cmd scheduler


【解决方案1】:

据我所知,这是不可能的。 但是,根据您对用户环境的了解程度,以下可能是一种解决方法:

命令

qwinsta

将为您提供计算机的会话列表。在这些会话中,一个将是活动会话,因此如果在交互式会话中使用此程序,则它基本上将包含您所描述的“登录用户”(实际上要复杂得多,可能有很多用户登录但只有一个可以处于活动状态,我只是希望您对程序的使用场景有足够的了解以利用它)。您可以解析输出并使用该用户名。

当然,这是一个肮脏的 hack,它假设在你的任务运行期间用户没有机会改变。

虽然我选择了 qwinsta.exe,因为它是一种非常基本的方法,不需要 API 调用,或者我仍然不确定 CMD 是否有足够的解析能力来为您获取必要的信息。

【讨论】:

  • 谢谢。该解决方案通常会起作用。但万一我不是。我会告诉你为什么。基本上我只需要在管理员注销时运行批处理文件。所以我的任务是在安全事件 4647(注销事件)上触发的。所以我测试了你的提议,并且没有更多的活动会话。我试图通过注册表通过组策略注销脚本来执行此操作,但它非常不稳定并且对我不起作用。
  • 所以你不需要活动用户,而是最后一个活动用户?在这种情况下,我会提出另一种解决方法。如果您可以保证没有远程会话,您可以尝试使用密钥 HKLM\Software\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\LastLoggedOnUser 这基本上是用于在登录屏幕上显示最后一个用户的关键窗口。远程会话没有保存在那里......如果你有它们,我会说编写一个程序,在每次登录时用用户信息覆盖 reg 密钥或文件,并稍后查询你自己的信息
【解决方案2】:

%username% 变量包含.. 用户名。

echo/%username%

编辑

正如你所说,因为你在一个计划任务中,你可以从 Windows 注册表中获取用户名

@echo off
for /f "tokens=3" %%a in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData\1 /v LoggedOnUserName') do (
set "user=%%a")
set "user=%user:.\=%"
echo/%user%

现在%user% 变量包含记录的用户名。

【讨论】:

  • 是的,但这将返回 AdminUser,因为他是计划任务的执行者。即使在 Windows 中您是作为 TestUser 登录的。我试试这个,还有 whoami 命令:)
  • 如果有用户的会话断开,这将不起作用。但是,如果 dEVIANT 可以排除这种情况,那它就没有我的想法那么疯狂了。
  • 在会话数据中我有 1,2,3 个键,其中一个是我的管理员用户,即使我以测试用户身份登录:/
  • @dEVIANT 背景键上方的LogonUI 键怎么样?那是您用户的密钥吗?
【解决方案3】:

这是使用批处理文件实现此目的的快速方法,命令如下:

for /F "tokens=1,2" %%i in ('qwinsta /server:%COMPUTERNAME% ^| findstr "console"') do set tempVar=%%j

echo %tempVar% 将显示实际登录的用户。而不是启动批处理文件的用户。

【讨论】: