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

如何在JavaScript中识别运行的系统级进程

获取进程用户名并区分系统/非系统进程

Windows平台解决方案

1. 使用psutil库

psutil是跨平台进程管理库,但在Windows下获取进程用户名需要管理员权限(普通权限会因访问限制无法读取系统进程信息)。以下是实现代码:

import psutil

def get_process_owner(proc):
    try:
        return proc.username()
    except (psutil.AccessDenied, psutil.NoSuchProcess, psutil.ZombieProcess):
        return None

# 遍历所有进程并分类
for proc in psutil.process_iter(['pid', 'name']):
    username = get_process_owner(proc)
    proc_info = proc.info
    print(f"进程名: {proc_info['name']}, PID: {proc_info['pid']}")
    
    if not username:
        print("  状态: 无权限获取用户信息")
        continue
    
    print(f"  用户: {username}")
    # 判断系统/非系统进程
    system_users = ['NT AUTHORITY\\SYSTEM', 'NT AUTHORITY\\LOCAL SERVICE', 'NT AUTHORITY\\NETWORK SERVICE']
    if username in system_users:
        print("  类型: 系统级进程")
    else:
        print("  类型: 非系统级进程")

2. 直接调用Windows API(pywin32)

如果psutil无法满足需求,可以通过pywin32调用Windows原生API获取进程令牌和用户信息,同样需要管理员权限:

import win32api
import win32security
import win32process

def get_process_username(pid):
    try:
        # 打开进程并获取令牌
        h_process = win32api.OpenProcess(win32process.PROCESS_QUERY_INFORMATION, False, pid)
        h_token = win32security.OpenProcessToken(h_process, win32security.TOKEN_QUERY)
        # 解析令牌获取SID
        sid, domain, _ = win32security.GetTokenInformation(h_token, win32security.TokenUser)
        # 转换SID为用户名
        username = win32security.LookupAccountSid(None, sid)[0]
        return f"{domain}\\{username}"
    except Exception:
        return None

# 遍历进程示例
for pid in win32process.EnumProcesses():
    if pid == 0:
        continue
    username = get_process_username(pid)
    # 获取进程名
    try:
        h_process = win32api.OpenProcess(win32process.PROCESS_QUERY_INFORMATION | win32process.PROCESS_VM_READ, False, pid)
        proc_path = win32process.GetModuleFileNameEx(h_process, 0)
        proc_name = proc_path.split('\\')[-1]
    except Exception:
        proc_name = "未知进程"
    
    print(f"进程名: {proc_name}, PID: {pid}")
    if not username:
        print("  状态: 无权限获取用户信息")
        continue
    
    print(f"  用户: {username}")
    system_users = ['NT AUTHORITY\\SYSTEM', 'NT AUTHORITY\\LOCAL SERVICE', 'NT AUTHORITY\\NETWORK SERVICE']
    if username in system_users:
        print("  类型: 系统级进程")
    else:
        print("  类型: 非系统级进程")

核心要点

  • 权限是关键:普通用户权限无法读取系统进程的令牌数据,必须以管理员身份运行程序,这是多数库无法返回用户名的主要原因。
  • 系统进程判定规则:Windows下系统级进程通常以NT AUTHORITY\SYSTEM、NT AUTHORITY\LOCAL SERVICE、NT AUTHORITY\NETWORK SERVICE这三类内置用户运行;其余用户(本地登录用户、域用户等)启动的进程属于非系统级进程。

内容的提问来源于stack exchange,提问作者Christian McCulley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:18:37