这个问题是this question的跟进和延续。关于我目前正在处理的权限问题。
问题总结:
我在没有调试程序 (SeDebugPrivilege)
权限的域管理员帐户下运行程序,但我需要在本地计算机上使用它。
Klugey 解决方案:
该程序可以将自身作为服务安装在本地机器上,并启动该服务。所述服务现在在 SYSTEM
帐户下运行,这使我们能够使用我们的 SeTCBPrivilege
权限创建一个新的具有 SeDebugPrivilege
的访问 token 。然后我们可以使用新创建的 token 重新启动具有提升权限的初始程序。
我个人不喜欢这个解决方案。我觉得应该有可能以管理员身份获得必要的权限, 不必进行系统修改,例如安装服务(即使只是临时的)。
我希望有一个解决方案可以最大限度地减少系统修改,并且最好可以即时完成(即:不需要重新启动自身)。我没有成功地尝试 LogonUser
作为 SYSTEM
并尝试在已知的 SYSTEM 进程(例如 csrss.exe)上 OpenProcessToken
(失败,因为你不能使用 PROCESS_QUERY_INFORMATION
OpenProcess
来获取进程的句柄,而没有我试图获得的权限)。
我已无计可施,无法找到解决此问题的替代方案。我希望有一种简单的方法可以在主机上获取特权 token 并为该程序模拟它,但我还没有找到方法。
如果有人知道解决这个问题的方法,或者甚至对可能的事情有建议,请告诉我。非常感谢您的帮助,谢谢!
最佳答案
根据设计,不允许任何进程获得 NT AUTHORITY\SYSTEM 权限,除非它由另一个具有 NT AUTHORITY\SYSTEM 权限的进程启动。该服务是一种解决方法,因为服务控制管理器本身在系统启动时由内核启动。
不幸的是,操作系统旨在阻止您正试图做的事情。如果您希望之后能够删除您的服务,只需授予相关用户本地计算机的 SeDebugPrivilege,然后让该服务自行卸载。
更好的是,让要修改其内存的程序更改 DACL,以允许您的管理员在没有 SeDebugPrivilege 的情况下访问它的内存。那么您根本不需要获取特权。
EDIT2:更好的是,首先使用共享内存。这就是它的用途。
关于c++ - 从管理员帐户模拟 SYSTEM(或等效),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2991957/