C++ DuplicateHandle:需要打开进程,但访问被拒绝
我使用windows挂钩向应用程序发送消息,系统上的每个应用程序都会通知我的应用程序windows事件 为了执行消息参数的封送处理,我使用共享内存。外部进程调用,但为了与我的应用程序实例共享句柄,它应使用进程_DUP _handle权限要求进行调用 实际上,每个应用程序都能够使用这种体系结构发送消息,即使我需要为外部进程启用SeDebugPrivilege。它实际上是有效的,除了“explorer”进程,它没有SeDebugPrivilege令牌 各国的文件: AdjustTokenPrivileges功能无法向访问令牌添加新权限。它只能启用或禁用令牌的现有权限。要确定令牌的权限,请调用GetTokenInformation函数C++ DuplicateHandle:需要打开进程,但访问被拒绝,c++,security,winapi,elevated-privileges,C++,Security,Winapi,Elevated Privileges,我使用windows挂钩向应用程序发送消息,系统上的每个应用程序都会通知我的应用程序windows事件 为了执行消息参数的封送处理,我使用共享内存。外部进程调用,但为了与我的应用程序实例共享句柄,它应使用进程_DUP _handle权限要求进行调用 实际上,每个应用程序都能够使用这种体系结构发送消息,即使我需要为外部进程启用SeDebugPrivilege。它实际上是有效的,除了“explorer”进程,它没有SeDebugPrivilege令牌 各国的文件: AdjustTokenPrivil
所以,问题是。。。如何将SeDebugPrivilege令牌添加到“explorer”进程,或者,如何允许“explorer”进程调用
OpenProcess(process\u DUP\u HANDLE,FALSE,pId)
?这就是您试图实现的目标吗
如果我理解正确,那么您根本不需要打开应用程序进程的句柄。相反,只需为共享内存块指定一个确定性名称,例如SharedMem_XXX,其中XXX是外部进程的PID。然后,使用窗口消息将PID发送到应用程序。然后它可以重新创建名称并使用它打开共享内存块。我不明白为什么不使用命名的共享内存。如果共享内存对象有名称,则可以在不使用
DuplicateHandle
的情况下打开此对象
如果您必须使用DuplicateHandle
并且需要能够在任何进程内部使用OpenProcess(PROCESS\u DUP\u HANDLE,FALSE,pId)
,我发现您不应该使用SeDebugPrivilege
。相反,您应该向所有人授予PROCESS\u DUP\u HANDLE
的pId
进程的权限。如果创建进程,则可以指定安全描述符。如果已创建进程,则可以使用OpenProcess
、GetSecurityInfo
(请参阅)和SetSecurityInfo
修改进程的安全描述符
要测试此方法,您只需使用管理权限启动Process Explorer(请参阅),打开所选流程的“安全”选项卡(带有
pId的流程)并修改其安全描述符。在这之后,所有进程都将能够使用OpenProcess(PROCESS\u DUP\u HANDLE,FALSE,pId)
而不启用SeDebugPrivilege
这是一个不错的解决方案,但这仅在我使用SendMessage时有效,而在我使用PostMessage时无效,因为应用程序可以在应用程序进程消息之前发送多条消息。我尝试用SendMessage替换PostMessage,看看系统性能是否受到影响。谢谢你的启发!不客气。我不太明白PostMessage和SendMessage是什么意思,但这可能与您的体系结构有关。如果你能提供更多关于你要完成什么的详细信息,我可能会更有帮助。根据你正在做什么,还有其他IPC机制可能更适合你的需要,例如窗口消息、命名管道或远程过程调用。这似乎正是我需要的!哪个SID对应于进程重复句柄?(我无法使用ProcEx修改进程SID…:()process_DUP_HANDLE是一个访问掩码,指定ACE控制的访问权限(请参阅)。您选择的SID可以是众所周知的Everyone组的SID(请参阅)。如果您不熟悉安全描述符,我建议您在可能的情况下使用ConvertStringSidToSid或ConvertStringSecurityDescriptorToSecurityDescriptor,并使用安全描述符定义语言(SDDL)(请参阅)。我发现:(消息目的地是托管进程)。它可以工作,但无法为“explorer”所属的WellKnownSidType.LogonidsId设置访问掩码(无法创建LogonidsId类型的安全标识符)。叹气。您可以使用WellKnownSidType.InteractiveId
(NT AUTHORITY\INTERACTIVE)或WellKnownSidType.WorldSid
(每个人)代替LogonIdsSid。它也可以工作。是的,它可以工作,但是…如果我以“管理员”身份运行应用程序,即使我授予所有权限,外部应用程序也无法调用OpenProcess。我是合理的,因为具有管理员权限的进程不能由具有较低权限的进程打开。