关于C#:DuplicateHandle:需要OpenProcess,但是访问被拒绝

DuplicateHandle: need to OpenProcess, but the access is denied

使用Windows挂钩,我向应用程序发送消息,系统上的每个应用程序都会收到有关Windows事件的通知。

要执行消息参数的封送处理,我使用共享内存。外部进程调用DuplicateHandle,但为了与我的应用程序实例共享句柄,它应调用具有PROCESS_DUP_HANDLE权限要求的OpenProcess。

实际上,即使我需要对外部进程启用SeDebugPrivilege,每个应用程序都可以使用此体系结构发送消息。它实际上是有效的,除了\\'explorer \\'进程(它没有SeDebugPrivilege令牌...)之外。

AdjustTokenPrivileges的文档说明:

The AdjustTokenPrivileges function cannot add new privileges to the access token. It can only enable or disable the token's existing privileges. To determine the token's privileges, call the GetTokenInformation function.

所以,问题是...如何将SeDebugPrivilege令牌添加到\\'explorer \\'进程,或者如何允许\\'explorer \\'进程调用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)


我不明白您为什么不使用命名共享内存。如果您的共享内存对象具有名称,则可以在不使用DuplicateHandle的情况下打开此对象。

如果您必须使用DuplicateHandle并且需要能够在任何进程中使用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId),我发现您不应该使用SeDebugPrivilege。取而代之的是,您应该为所有人使用pId授予PROCESS_DUP_HANDLE权限。如果创建进程,则可以指定安全描述符。如果已经创建了该进程,则可以使用OpenProcessGetSecurityInfo(请参阅http://msdn.microsoft.com/zh-cn/library/aa446654.aspx)和SetSecurityInfo来修改该进程的安全描述符。

要测试此方法,您只需启动具有管理权限的Process Explorer(请参阅http://technet.microsoft.com/zh-cn/sysinternals/bb896653.aspx),然后打开所选进程(带有pId)并修改其安全描述符。之后,所有进程将能够使用OpenProcess(PROCESS_DUP_HANDLE, FALSE, pId)而无需启用SeDebugPrivilege


这是您要完成的事情吗?

  • 在"外部"过程中创建一个共享内存块。
  • 使用DuplicateHandle在您的应用程序中创建该内存的句柄
  • 使用窗口消息将句柄值发送到您的应用程序
  • 访问应用程序中的共享内存
  • 如果我正确理解,那么您根本不需要打开申请过程的句柄。而是给共享内存块一个确定性的名称,例如SharedMem_XXX,其中XXX是外部进程的PID。然后,使用窗口消息将PID发送到您的应用程序。然后,它可以重新创建名称,并使用它打开共享内存块。