You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows服务中Python程序获取登录用户名显示SYSTEM求解决方案

解决Windows服务中获取当前登录用户名的问题

原因分析

Windows服务默认以SYSTEM账户运行在会话0,而用户登录的会话是独立的(通常从会话1开始),所以os.getlogin()、getpass.getuser()这类方法只能拿到服务运行的账户,而非当前登录的用户。

解决方案

方法1:用pywin32调用Windows API获取活动会话用户

先安装pywin32库:

pip install pywin32

然后用这段代码获取当前登录用户:

import win32api
import win32security
import win32ts

def get_current_logged_on_user():
    # 枚举所有会话
    sessions = win32ts.WTSEnumerateSessions(win32ts.WTS_CURRENT_SERVER_HANDLE)
    for session in sessions:
        session_id = session['SessionId']
        # 跳过服务所在的会话0
        if session_id == 0:
            continue
        # 获取会话对应的用户名
        try:
            username = win32ts.WTSQuerySessionInformation(
                win32ts.WTS_CURRENT_SERVER_HANDLE,
                session_id,
                win32ts.WTSUserName
            )[0]
            # 可选:获取域名
            domain = win32ts.WTSQuerySessionInformation(
                win32ts.WTS_CURRENT_SERVER_HANDLE,
                session_id,
                win32ts.WTSDomainName
            )[0]
            return f"{domain}\\{username}" if domain else username
        except:
            continue
    # 没找到活动用户时返回SYSTEM
    return "SYSTEM"

# 测试调用
print(get_current_logged_on_user())

方法2:修改NSSM服务的运行账户

如果你的服务不需要用SYSTEM账户运行,可以直接改服务的运行身份:

  1. 打开命令行,执行nssm edit <你的服务名>
  2. 在弹出的配置窗口切到Log On标签页
  3. 选This account,输入当前登录的用户名和密码,点OK保存
  4. 重启服务后,os.getlogin()就能正常返回该用户名

方法3:通过环境变量获取(仅特定场景可用)

用户登录后系统会设置USERNAME环境变量,但服务默认不继承用户环境,需要在NSSM里开启加载用户配置:

  1. 运行nssm edit <你的服务名>
  2. 切到Details标签页,勾选Load user profile
  3. 重启服务后,尝试用os.environ.get('USERNAME')获取用户名,但这种方法可靠性不高,仅部分环境有效

注意事项

  • 方法1是最可靠的,能准确拿到当前活动会话的登录用户,多用户登录时会返回第一个活动会话的用户
  • 方法2需要知道用户密码,且用户注销后服务可能无法正常运行
  • 方法3依赖环境变量,不适用于所有场景

内容的提问来源于stack exchange,提问作者Chamuditha Ravindu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:31:01