AdjustTokenPrivileges报错1300(ERROR_NOT_ALL_ASSIGNED)解决方案
问题根因

你遇到的错误码1300(ERROR_NOT_ALL_ASSIGNED)原因非常明确:
AdjustTokenPrivileges接口仅能修改当前进程访问令牌中已经被分配的特权状态,无法为进程新增原本不存在的特权。- 未经过UAC提权、以标准普通用户身份运行的进程,其访问令牌中默认没有分配
SeDebugPrivilege特权。你能通过LookupPrivilegeValue查到特权对应的LUID,仅代表系统存在这个特权定义,不代表你的进程有使用该特权的权限,因此调用直接失败。 - 你提出的「尽可能低权限、不触发UAC、无需管理员权限就能终止SYSTEM权限运行的进程」的需求,本身违反Windows核心安全隔离设计:SYSTEM是系统最高权限等级,普通用户权限进程默认没有任何权限修改、终止运行在SYSTEM上下文的受保护进程,你要终止的AnyDesk在安装为系统服务时就运行在SYSTEM权限下,还自带进程自我保护逻辑,非管理员权限根本无法操作。
可行修改方案
不存在无管理员权限、不触发UAC就能静默终止SYSTEM进程的合规方法,所有合法实现路径都必须获得管理员权限。如果你可以接受程序启动时触发一次UAC提权提示,对代码做如下修改即可实现目标:
- 为程序添加UAC清单文件,指定执行级别为
requireAdministrator,确保程序启动后能拿到带有SeDebugPrivilege分配的管理员令牌,你现有的特权启用逻辑才能正常生效。 - 修复
SetPrivilege函数中的逻辑错误:第一次调用AdjustTokenPrivileges时第二个参数你传了-1(对应布尔值True),这会直接禁用令牌内所有特权,属于完全多余的错误操作,将该参数改为0(False)即可,仅查询特权状态不做全局禁用。
修正后的对应代码行:lResult = AdjustTokenPrivileges(hToken, 0, TP, Len(TP), TPPrevious, cbPrevious) - 调用
OpenProcess时不要使用PROCESS_ALL_ACCESS申请全量权限,终止进程仅需要PROCESS_TERMINATE权限即可,过度申请权限反而会被系统进程的安全访问策略拦截。
修正后的对应代码行:hProcess = OpenProcess(PROCESS_TERMINATE, 0, hProcessID) - 补充逻辑:如果目标进程是作为系统服务运行的(比如AnyDesk的服务端进程),就算拿到
SeDebugPrivilege直接调用TerminateProcess也可能失败,因为服务进程会被服务控制管理器(SCM)保护,需要先通过SCM停止对应服务,再终止残留进程。
如果你坚持要求完全不触发UAC、程序始终以普通用户权限运行,没有任何合规开发手段可以实现终止SYSTEM进程的需求。Windows设计权限隔离机制的核心目标就是阻止低权限进程操作高权限系统级进程,能绕过这个限制的手段都是利用未修复的本地提权漏洞,属于恶意软件常用的技术范畴,不在正常桌面应用的实现考虑范围内。
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

