位置:首页 > JavaScript > 如何通过进程用户名判断Windows系统级进程

如何通过进程用户名判断Windows系统级进程

时间:2026-08-17  |  作者:极客少年  |  阅读:0

这段内容主要讲一件事:如何在 Node.js 里调用 Windows 的 tasklist 命令,把当前所有进程的详细信息连同用户名一起拿到。基于这些信息,就能进一步把系统级进程(比如 Windows PowerShell、svchost.exe)和用户级应用(比如 Discord.exe)清楚地区分开,从而更准确地判断进程所处的权限层级。

如何通过进程用户名识别 Windows 系统级进程

这段内容要解决的,其实是在 Node.js 里调用 Windows 的 tasklist 命令,把系统中所有进程的详细信息连同用户名一起拿出来。再据此把系统级进程,例如 Windows PowerShellsvchost.exe,和用户级应用,例如 Discord.exe,清晰区分开。最终实现更准确的进程权限层级判断。

判断系统级进程的关键依据

在 Windows 平台上,判断一个进程是否属于系统级,即以 SYSTEM、LOCAL SERVICE、NETWORK SERVICE 或高权限管理员身份运行,关键依据之一是其所属用户名(User Name)

常见对应关系如下:

  • SYSTEMNT AUTHORITYSYSTEM → 典型系统核心进程,如 winlogon.exelsass.exe
  • NT AUTHORITYLOCAL SERVICE / NT AUTHORITYNETWORK SERVICE → 系统服务进程,如 dwm.exe、部分 svchost.exe 实例
  • DOMAINUserCOMPUTERNAMEUsername → 普通用户启动的进程,如 chrome.exeDiscord.exe

在 Node.js 中获取进程用户名

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('n');
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 AUTHORITYSYSTEM',
'NT AUTHORITYLOCAL SERVICE',
'NT AUTHORITYNETWORK 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);

实现思路说明

这段代码通过 spawn 启动 tasklist,并传入 /V/FO csv 参数。命令执行后,会收集标准输出和错误输出。

当进程结束时,代码会先检查退出码。如果退出码不是 0,就直接抛出错误。

如果执行成功,再对 CSV 内容进行解析。解析后可拿到每个进程的字段信息,包括 Image NamePIDUser Name 等。

最后,程序会根据 User Name 是否属于 SYSTEMNT AUTHORITYSYSTEMNT AUTHORITYLOCAL SERVICENT AUTHORITYNETWORK SERVICE,来判断该进程是系统级还是用户级。

注意事项

  • 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_ProcessOwner 属性。
  • 该方案仅适用于 Windows;Linux/macOS 需改用 ps -eo pid,user,args 等命令,并解析对应字段。

适用场景

掌握此方法后,你可在以下场景中更可靠地区分系统关键进程与第三方应用:

  • 自动化运维脚本
  • 安全审计工具
  • 进程监控应用

这能为权限控制、异常检测等场景提供坚实基础。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多