无管理员权限下,如何订阅Windows新进程启动事件?
无需管理员权限的进程启动事件订阅方法
当然有无需管理员权限就能订阅的进程启动事件方案,下面是两种实用的实现方式:
1. WMI临时事件监听(基于Win32_Process)
利用WMI的临时实例创建事件,不需要管理员权限,只能监听当前用户有权访问的进程,足够覆盖日常用户上下文场景。示例代码:
# 构造监听进程启动的WMI查询 $query = "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'" # 注册事件并定义触发动作 Register-CimIndicationEvent -Query $query -Action { $proc = $event.SourceEventArgs.NewEvent.TargetInstance Write-Host "新进程:$($proc.Name) | PID: $($proc.ProcessId)" }
注:这种方式无法捕获系统级或其他用户的进程,但对当前用户启动的进程监听足够精准。
2. .NET Process类轮询优化方案
虽然是轮询,但通过缩短扫描间隔可以降低短生命周期进程的遗漏概率,且无需管理员权限:
# 记录初始进程ID列表 $existingPids = (Get-Process).Id while ($true) { $currentPids = (Get-Process).Id # 找出新增的进程ID $newPids = Compare-Object $existingPids $currentPids | Where-Object SideIndicator -eq '=>' | Select-Object -ExpandProperty InputObject foreach ($pid in $newPids) { try { $proc = Get-Process -Id $pid -ErrorAction Stop Write-Host "新进程启动:$($proc.ProcessName) | PID: $pid" } catch { # 跳过无权限访问的进程 continue } } $existingPids = $currentPids Start-Sleep -Milliseconds 100 }
如果需要关联父进程,在获取到进程后可以通过$proc.Parent.Id(PowerShell 5.1+支持)或者查询Win32_Process的ParentProcessId来匹配,但同样只能访问当前用户权限内的进程关系。
重要提示
无管理员权限时,所有方案都只能监控当前用户有权限访问的进程,系统核心进程、其他用户的进程无法被捕获,这是Windows权限模型的限制。
内容的提问来源于stack exchange,提问作者alx9r
相关产品推荐
相关产品推荐

