从管理员帐户模拟SYSTEM(或等效)

时间:2010-06-07 18:07:26

标签: c++ windows impersonation privileges

这个问题是关于我目前正在处理的特权问题的this question的后续和延续。



问题摘要:
我正在一个没有Debug programs (SeDebugPrivilege)权限的域管理员帐户下运行程序,但我需要在本地计算机上。


Klugey解决方案:
程序可以将自身作为服务安装在本地计算机上,然后启动该服务。所述服务现在在SYSTEM帐户下运行,这使我们能够使用我们的SeTCBPrivilege权限来创建具有SeDebugPrivilege的新访问令牌。然后,我们可以使用新创建的令牌以提升的权限重新启动初始程序。


我个人不喜欢这个解决方案。我觉得应该可以以管理员获得必要的权限,而不必进行系统修改,例如安装服务(即使它只是暂时的)。

我希望有一种解决方案能够最大限度地减少系统修改,并且最好能够即时完成(即:不需要重新启动)。我未能成功LogonUser作为SYSTEM并尝试OpenProcessToken已知的SYSTEM流程(例如csrss.exe)(失败,因为您无法OpenProcess { {1}}在没有我试图获取的权限的情况下获取进程的句柄。

我正在努力为这个问题提出另一种解决方案。我希望有一种简单的方法可以在主机上获取特权令牌并为此程序冒充它,但我还没找到方法。



如果有人知道解决这个问题的方法,或者甚至对可能的工作提出建议,请告诉我。我非常感谢你的帮助,谢谢!

1 个答案:

答案 0 :(得分:4)

按照设计,除非由具有NT AUTHORITY \ SYSTEM权限的其他进程启动,否则不允许进程实现NT AUTHORITY \ SYSTEM权限。该服务是一种解决方法,因为服务控制管理器本身是由系统启动时的内核启动的。

不幸的是,操作系统旨在阻止您正在尝试做的事情。如果您希望以后能够删除您的服务,只需向有问题的用户授予本地计算机的SeDebugPrivilege,然后让服务自行卸载。

更好的是,让要修改内存的程序更改DACL,以允许管理员在没有SeDebugPrivilege的情况下访问它的内存。那么你根本不需要获得特权。

EDIT2:更好的是,首先只使用共享内存。这就是它的用途。