如何在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
相关产品推荐
相关产品推荐

