我使用Windows挂钩将消息发送到我的应用程序,系统上的每个应用程序都会收到有关Windows事件的通知。
为了执行消息参数的封送处理,我使用共享内存。外部进程调用DuplicateHandle,但是为了与我的应用程序实例共享该句柄,它将调用具有PROCESS_DUP_HANDLE特权要求的OpenProcess。
实际上,即使我需要为外部进程启用SeDebugPrivilege,每个应用程序都可以使用此体系结构发送消息。它实际上是有效的,除了“Explorer”进程外,该进程没有SeDebugPrivilege token ...
AdjustTokenPrivileges的文档指出:
因此,问题是……如何将SeDebugPrivilege token 添加到“explorer”进程,或者如何允许“explorer”进程调用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)
?
最佳答案
我不明白您为什么不使用名为共享内存的。如果您的共享内存对象具有名称,那么可以在不使用DuplicateHandle
的情况下打开此对象。
如果您确实必须使用DuplicateHandle
,并且需要能够在任何进程中使用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)
,那么我发现您不应该使用SeDebugPrivilege
。取而代之的是,您应该向每个人授予PROCESS_DUP_HANDLE
的权限,以使用pId
进行该过程。如果创建进程,则可以指定安全描述符。如果已经创建了流程,则可以使用OpenProcess
,GetSecurityInfo
(请参阅http://msdn.microsoft.com/en-us/library/aa446654.aspx)和SetSecurityInfo
来修改流程的安全描述符。
要测试这种方法,您可以使用管理权限启动Process Explorer(请参阅http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx),打开所选进程(带有pId
的进程)的“安全性”选项卡,然后修改其安全描述符。之后,所有进程将能够使用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)
而无需启用SeDebugPrivilege
。
关于c++ - DuplicateHandle:需要OpenProcess,但是访问被拒绝,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3400675/