2010-08-03 346 views
2

使用Windows挂钩我向我的应用程序发送消息,应用程序会通过系统上的每个应用程序通知Windows事件。DuplicateHandle:需要OpenProcess,但访问被拒绝

要执行消息参数的编组,我使用共享存储器。外部进程调用DuplicateHandle,但为了与我的应用程序实例共享句柄,它应使用PROCESS_DUP_HANDLE权限要求调用OpenProcess

实际上,即使我需要启用SeDebugPrivilege到外部进程,实际上每个应用程序都能够使用此体系结构发送消息。它的实际工作,除了“资源管理器”的过程,没有SeDebugPrivilege令牌......

AdjustTokenPrivileges状态的文档:

的AdjustTokenPrivileges函数不能添加新的权限来访问令牌。它只能启用或禁用令牌的现有权限。要确定令牌的权限,请调用GetTokenInformation函数。

所以,问题是...如何添加SeDebugPrivilege令牌“资源管理器”的过程,或者,如何让“资源管理器”进程调用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)

回答

3

我不明白你为什么不使用命名为共享内存。如果共享内存对象具有名称,则可以在不使用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

+0

这似乎正是我需要的!什么SID对应于PROCESS_DUP_HANDLE? (我无法使用ProcEx ... :() – Luca 2010-08-03 22:12:52

+0

修改进程SID PROCESS_DUP_HANDLE是一个访问权限,用于指定由ACE控制的访问权限(请参阅http://msdn.microsoft.com/zh-cn/library/ aa374868.aspx)。您选择的SID可以是众所周知的Everyone组的SID(请参阅http://msdn.microsoft.com/en-us/library/aa379649.aspx)。如果您不熟悉安全描述符I建议您使用ConvertStringSidToSid或ConvertStringSecurityDescriptorToSecurityDescriptor,尽可能使用安全描述符定义语言(SDDL)(请参阅http://msdn.microsoft.com/zh-cn/library/aa379567.aspx)。 – Oleg 2010-08-03 22:31:45

+0

我发现这个:http:///stackoverflow.com/questions/1909084/is-there-a-way-to-modify-a-process-dacl-in-c(消息目标是一个托管进程)。它可以工作,但不能为WellKnownSidType设置访问掩码。 “资源管理器”所属的LogonIdsSid(无法创建LogonIdsSid类型的SecurityIdentifier)。叹息。 – Luca 2010-08-03 23:43:22

1

这是你想要完成的吗?

  1. 在“外部”进程中创建一个共享内存块。
  2. 使用DuplicateHandle在应用程序中
  3. 使用窗口消息创建一个句柄内存句柄值发送到您的应用程序
  4. 访问共享内存在应用程序

如果我正确理解,那么你根本不需要打开应用程序的句柄。相反,只需给共享内存块一个确定性名称,如SharedMem_XXX,其中XXX是外部进程的PID。然后,使用窗口消息将PID发送到您的应用程序。然后它可以重新创建名称并使用它来打开共享内存块。

+0

不错的解决方案,但是这只会在我使用SendMessage时起作用,而不是在我使用PostMessage时起作用,因为在应用程序处理消息之前应用程序可以发送多个消息。我尝试用SendMessage替换PostMessage,并查看系统性能是否受到影响。谢谢你的照亮! – Luca 2010-08-03 21:50:51

+0

不客气。我不太明白PostMessage与SendMessage的含义,但这可能与您的架构有关。如果你能提供更多关于你想要完成的细节,我可能会更有帮助。 – 2010-08-03 21:57:34

+0

根据您的具体情况,还有其他IPC机制可能更适合您的需求,如窗口消息,命名管道或远程过程调用。 – 2010-08-03 21:59:35