
本文介绍如何在 Node.js 中调用 Windows tasklist 命令获取所有进程的详细信息(包括用户名),进而区分系统级进程(如 Windows PowerShell、svchost.exe)与用户级应用(如 Discord.exe),实现精准的进程权限层级判断。
本文介绍如何在 node.js 中调用 windows `tasklist` 命令获取所有进程的详细信息(包括用户名),进而区分系统级进程(如 `windows powershell`、`svchost.exe`)与用户级应用(如 `discord.exe`),实现精准的进程权限层级判断。
在 Windows 平台上,判断一个进程是否属于系统级(即以 SYSTEM、LOCAL SERVICE、NETWORK SERVICE 或高权限管理员身份运行)的关键依据之一是其所属用户名(User Name)。例如:
-
SYSTEM、NT AUTHORITYSYSTEM→ 典型系统核心进程(如winlogon.exe、lsass.exe) -
NT AUTHORITYLOCAL SERVICE/NT AUTHORITYNETWORK SERVICE→ 系统服务进程(如dwm.exe、部分svchost.exe实例) -
DOMAINUser或COMPUTERNAMEUsername→ 普通用户启动的进程(如chrome.exe、Discord.exe)
Node.js 本身不提供跨平台的进程用户信息 API,但可通过标准 Windows 命令行工具 tasklist 高效获取。推荐使用 /V(详细模式)和 /FO csv(CSV 格式输出)组合,确保结构化、易解析的数据:
const { spawn } = require('child_process');
function listProcessesWithUser() {
return new Promise((resolve, reject) => {
const tasklist = spawn('tasklist', ['/V', '/FO', 'csv']);
let stdoutData = '';
let stderrData = '';
tasklist.stdout.on('data', (chunk) => {
stdoutData += chunk;
});
tasklist.stderr.on('data', (chunk) => {
stderrData += chunk;
});
tasklist.on('close', (code) => {
if (code !== 0) {
return reject(new Error(`tasklist exited with code ${code}: ${stderrData}`));
}
try {
// 解析 CSV(注意:Windows CSV 可能含双引号包围字段,且含 BOM)
const lines = stdoutData.trim().split('
');
const headers = lines[0].replace(/^"|"$/g, '').split('","');
const processes = lines.slice(1).map(line => {
const values = line.match(/"([^"]*)"/g)?.map(v => v.slice(1, -1)) || [];
return Object.fromEntries(
headers.map((h, i) => [h.trim(), values[i] || ''])
);
});
resolve(processes);
} catch (e) {
reject(new Error('Failed to parse tasklist CSV output: ' + e.message));
}
});
});
}
// 使用示例
listProcessesWithUser()
.then(processes => {
processes.forEach(proc => {
const userName = proc['User Name']?.trim() || '';
const isSystemLevel = [
'SYSTEM',
'NT AUTHORITY\SYSTEM',
'NT AUTHORITY\LOCAL SERVICE',
'NT AUTHORITY\NETWORK SERVICE'
].some(name => userName.toUpperCase() === name.toUpperCase());
console.log(`${proc['Image Name']} (PID: ${proc['PID']}) → User: "${userName}" → ${isSystemLevel ? '✅ System-level' : '❌ User-level'}`);
});
})
.catch(console.error);
⚠️ 注意事项:
-
tasklist /V需要管理员权限才能获取所有进程的用户名;普通权限下,部分系统进程的“User Name”字段可能显示为N/A或被截断。建议以管理员身份运行 Node.js 脚本。 - CSV 输出首行为表头(如
"Image Name","PID","Session Name","Session#","Mem Usage","Status","User Name","CPU Time","Window Title"),注意字段顺序可能因系统语言/版本略有差异,应以实际输出为准。 - 某些进程(如
explorer.exe)虽由用户启动,但可能拥有较高完整性级别(Integrity Level),仅靠用户名不足以完全判定安全上下文——如需更严格判断,可结合Get-Process | Select-Object Name,Id,UserName,Path,StartInfo(PowerShell)或 WMI 查询Win32_Process的Owner属性。 - 该方案仅适用于 Windows;Linux/macOS 需改用
ps -eo pid,user,args等命令,并解析对应字段。
掌握此方法后,你可在自动化运维脚本、安全审计工具或进程监控应用中,可靠地区分系统关键进程与第三方应用,为权限控制、异常检测等场景提供坚实基础。










