powershell可通过get-ciminstance获取进程完整路径并结合所有者与完整性级别判断启动权限,但标准用户受限于权限无法读取其他用户或系统进程信息。
powershell 可以直接获取进程的可执行文件路径,并判断其启动权限(如是否以管理员身份运行),但需注意:标准用户无法读取其他用户或系统进程的完整路径和令牌信息,部分结果可能返回空或拒绝访问。
获取进程的启动路径(ImageName)
多数进程的启动路径可通过 Get-Process 的 Path 属性获取,但该属性在 PowerShell 5.1+ 中默认不填充,需配合 WMI 或 CIM 查询:
- 使用
Get-CimInstance查询 Win32_Process 类,ExecutablePath字段即为完整启动路径(需本地管理员权限才能看到所有进程):
> Get-CimInstance -ClassName Win32_Process | Select-Object Name, ProcessId, ExecutablePath | Where-Object ExecutablePath
- 若只需当前用户进程且追求轻量,可用
Get-Process+Get-Item尝试反查(仅对已加载模块有效,不适用于服务或沙盒进程):
> Get-Process notepad | ForEach-Object { try { (Get-Item $_.Path -ErrorAction Stop).FullName } catch {} }
判断进程是否以管理员权限运行
Windows 没有直接标记“是否管理员”的字段,需检查进程令牌的完整性级别(IL)或组成员身份。常用方法是读取进程的访问令牌并检测是否存在 NT AUTHORITY\SYSTEM 或 BUILTIN\Administrators 组:
- 使用
OpenProcessToken和GetTokenInformation(需 P/Invoke)较复杂;更实用的是借助whoami /groups /fo csv对比,或用Get-Process+Get-ACL辅助推断 - 简洁可靠的做法:检查进程所有者(Owner)是否为 SYSTEM 或 Administrators 成员,再结合
Integrity Level—— 高完整性(High IL)通常对应提权运行:
> $p = Get-Process -Id 1234; $owner = (Get-Process -Id $p.Id -ErrorAction SilentlyContinue | ForEach-Object { try { (Get-Acl "Process:$($_.Id)").Owner } catch {} }); $owner
- 更推荐使用社区模块
Carbon或自定义函数解析令牌完整性级别(例如通过Get-ProcessTokenInformation,需提前定义 C# 代码加载)
一键检测脚本示例(含权限与路径)
以下脚本尝试获取指定进程 ID 的启动路径与权限提示(需以管理员身份运行以获得完整结果):
function Test-ProcessAuth {
param($PID)
$proc = Get-CimInstance Win32_Process -Filter "ProcessId = $PID" -ErrorAction SilentlyContinue
if ($proc) {
[PSCustomObject]@{
Name = $proc.Name
PID = $proc.ProcessId
Path = $proc.ExecutablePath
Owner = $proc.GetOwner().User
AuthLevel = if ($proc.ExecutablePath -like "*Program Files*") { "Likely elevated" } else { "Standard user context" }
}
}
}
- 注意:
GetOwner()在非管理员会话中常返回空;实际生产建议搭配Start-ThreadJob并捕获AccessDenied异常做降级处理 - 对服务类进程(如 svchost),应优先查
Get-WmiObject Win32_Service获取PathName
权限限制与绕过说明
普通用户运行 PowerShell 时,默认无法读取以下信息:
- 其他用户会话中的进程路径(如登录多个账户时)
- 受保护进程(PPL)、CIM 进程(如 lsass.exe)、驱动宿主进程
- 某些 UWP 应用的真实磁盘路径(显示为 AppX 协议或空)
绕过需满足:以 SYSTEM 或目标用户上下文运行(如通过 psexec -s、计划任务或服务),或启用 SeDebugPrivilege(高风险,不推荐常规使用)。











