C++ DuplicateHandle:需要打开进程,但访问被拒绝

C++ DuplicateHandle:需要打开进程,但访问被拒绝,c++,security,winapi,elevated-privileges,C++,Security,Winapi,Elevated Privileges,我使用windows挂钩向应用程序发送消息,系统上的每个应用程序都会通知我的应用程序windows事件 为了执行消息参数的封送处理,我使用共享内存。外部进程调用,但为了与我的应用程序实例共享句柄,它应使用进程_DUP _handle权限要求进行调用 实际上,每个应用程序都能够使用这种体系结构发送消息,即使我需要为外部进程启用SeDebugPrivilege。它实际上是有效的,除了“explorer”进程,它没有SeDebugPrivilege令牌 各国的文件: AdjustTokenPrivil

我使用windows挂钩向应用程序发送消息,系统上的每个应用程序都会通知我的应用程序windows事件

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

实际上,每个应用程序都能够使用这种体系结构发送消息,即使我需要为外部进程启用SeDebugPrivilege。它实际上是有效的,除了“explorer”进程,它没有SeDebugPrivilege令牌

各国的文件:

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


所以,问题是。。。如何将SeDebugPrivilege令牌添加到“explorer”进程,或者,如何允许“explorer”进程调用
OpenProcess(process\u DUP\u HANDLE,FALSE,pId)

这就是您试图实现的目标吗

  • 在“外部”进程中创建共享内存块
  • 使用DuplicateHandle在应用程序中创建该内存的句柄
  • 使用窗口消息将句柄值发送到应用程序
  • 访问应用程序中的共享内存

  • 如果我理解正确,那么您根本不需要打开应用程序进程的句柄。相反,只需为共享内存块指定一个确定性名称,例如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。我是合理的,因为具有管理员权限的进程不能由具有较低权限的进程打开。