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

Node.js/Electron:如何区分Windows系统服务进程与普通应用进程

嘿,你这个需求我太懂了——要区分Windows系统服务和普通应用进程,只展示Top5高CPU的应用对吧?结合你现有的两种实现方式,我给你整理了几个靠谱的方法:

区分Windows系统服务与普通应用进程的实用方案

方案一:调用Windows系统API(最精准)

Windows里,系统服务和普通应用的核心区别之一是会话ID:普通用户启动的应用一般在会话1,而绝大多数系统服务运行在会话0;另外,服务进程会关联对应的服务名称。

你可以用node-processlist这个Node.js库(它封装了Windows的WMI查询),直接获取进程的会话ID和服务关联信息,过滤起来很方便:

const processlist = require('node-processlist');

async function getTopNonServiceApps() {
  // 获取包含会话ID、服务名的进程列表
  const allProcesses = await processlist.getProcesses(['pid', 'name', 'cpu', 'sessionId', 'serviceName']);
  
  // 过滤掉服务进程:要么有服务名,要么会话ID为0
  const nonServiceApps = allProcesses.filter(p => !p.serviceName && p.sessionId !== 0);
  
  // 按CPU占用降序排序,取前5
  const top5 = nonServiceApps.sort((a, b) => b.cpu - a.cpu).slice(0, 5);
  
  console.log('Top5高CPU占用的普通应用:', top5);
}

getTopNonServiceApps();

方案二:优化你现有的tasklist命令

tasklist本身支持带参数输出服务关联信息,加上/svc和/v参数后,能看到每个进程对应的服务名——普通应用的Services列会显示N/A,服务进程则会列出具体服务名。

修改你的方法二代码,解析CSV格式的输出会更方便处理:

var exec = require('child_process').exec;

exec('tasklist /v /svc /fo csv', function(err, stdout, stderr) {
  if (err) { 
    console.error('执行命令出错:', err); 
    return; 
  }
  
  // 解析CSV内容
  const lines = stdout.toString().split('\n').filter(line => line.trim() !== '');
  const headers = lines[0].split(',').map(h => h.replace(/"/g, ''));
  // 找到服务列和会话名称列的索引
  const serviceColIdx = headers.indexOf('Services');
  const sessionNameColIdx = headers.indexOf('Session Name');
  
  // 过滤出普通应用:服务列为N/A,且会话名称不是Services
  const nonServiceApps = lines.slice(1).map(line => {
    const parts = line.split(',').map(p => p.replace(/"/g, ''));
    return {
      appName: parts[0],
      pid: parts[1],
      cpuUsage: parts[8], // 注意:列索引可能需要根据你的系统输出调整
      services: parts[serviceColIdx],
      sessionName: parts[sessionNameColIdx]
    };
  }).filter(p => p.services === 'N/A' && p.sessionName !== 'Services');
  
  // 按CPU占用排序(记得转成数字)
  const top5 = nonServiceApps.sort((a, b) => parseFloat(b.cpuUsage) - parseFloat(a.cpuUsage)).slice(0, 5);
  
  console.log('Top5高CPU占用的普通应用:', top5);
});

方案三:基于进程路径判断(简单直观)

系统服务的可执行文件大多在C:\Windows\System32或C:\Windows\SysWOW64目录下,而普通应用一般在C:\Program Files、C:\Users这些用户目录里。结合你方法一中的current-processes库,可以通过进程路径过滤:

var _ = require('lodash'); 
var ps = require('current-processes'); 

ps.get(function(err, processes) {
  if (err) { 
    console.error('获取进程列表出错:', err); 
    return; 
  }
  
  // 过滤掉系统目录下的进程
  const nonServiceApps = processes.filter(p => {
    if (!p.path) return false; // 无法获取路径的进程暂时排除
    const systemDirs = ['C:\\Windows\\System32', 'C:\\Windows\\SysWOW64'];
    return !systemDirs.some(dir => p.path.startsWith(dir));
  });
  
  // 排序取Top5
  var sortedApps = _.sortBy(nonServiceApps, 'cpu').reverse();
  var top5 = sortedApps.splice(0, 5); 
  console.log('Top5高CPU占用的普通应用:', top5); 
});

小提醒:

  • 少数系统服务可能也会运行在用户会话(比如部分硬件驱动服务),建议结合会话ID+服务名两种判断方式,准确率更高。
  • 获取进程路径或服务信息需要足够权限,最好以管理员身份运行你的Node.js程序哦。

内容的提问来源于stack exchange,提问作者Anand Vaidya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:38:23