非提升权限进程如何检测其他进程是否以管理员权限运行?
非提升权限进程检测Windows进程是否已UAC提权的方法
本文中提及的“elevated”指Windows UAC环境下的以管理员身份运行权限提升状态。
常规检测方法及其局限性
检测进程是否拥有提升权限的常规流程是:
- 使用
OpenProcess获取目标进程句柄 - 通过
OpenProcessToken获取该进程的访问令牌 - 调用
GetTokenInformation()并传入TokenElevation或TokenElevationType参数,最后检查返回结果
但这个方法存在核心问题:OpenProcessToken要求进程句柄具备PROCESS_QUERY_INFORMATION权限。讽刺的是,当检测进程本身未获得权限提升,而目标进程已提权时,调用OpenProcess会直接返回访问被拒绝错误,导致检测无法执行。
有人可能会据此推断目标进程已提权,但这并不准确——另一种可能是目标进程由其他用户启动,同样会触发访问拒绝。
特殊场景需求
多数情况下,直接尝试执行所需操作并根据“访问被拒绝”错误来判断权限状态会更简单,但我遇到了一个特定场景:需要启动一个外部应用,并根据第三方进程是否以管理员身份运行来决定是否以管理员权限启动该应用。由于此场景下“直接尝试操作”的复杂度远高于调用一两个API函数,因此希望找到一种更直接的方法,让非提升权限进程能够准确检测其他进程是否已提升权限。
内容的提问来源于stack exchange,提问作者oblivioncth
相关产品推荐
相关产品推荐

