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权限。如果创建进程,则可以指定安全描述符。如果已经创建了该进程,则可以使用OpenProcess,GetSecurityInfo(请参阅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。
-
看来正是我需要的!对应于PROCESS_DUP_HANDLE的SID是什么? (我无法使用ProcEx ... :()修改进程SID。
-
PROCESS_DUP_HANDLE是一个访问掩码,它指定ACE控制的访问权限(请参阅msdn.microsoft.com/en-us/library/aa374868.aspx)。您选择的SID可以是Everyone组的众所周知的SID(请参阅msdn.microsoft.com/en-us/library/aa379649.aspx)。如果您不熟悉安全描述符,建议您在可能的地方使用ConvertStringSidToSid或ConvertStringSecurityDescriptorToSecurityDescriptor并使用安全描述符定义语言(SDDL)(请参阅msdn.microsoft.com/zh-cn/library/aa379567.aspx)。
-
我发现了这一点:stackoverflow.com/questions/1909084/…(消息目标是一个托管进程)。它可以工作,但是不能为\\'explorer \\'所属的WellKnownSidType.LogonIdsSid设置访问掩码(无法创建LogonIdsSid类型的SecurityIdentifier)。叹。
-
您可以使用WellKnownSidType.InteractiveSid(NT AUTHORITY \\\\\\\\ INTERACTIVE)或WellKnownSidType.WorldSid(Everyone)代替LogonIdsSid。它也将起作用。
-
是的,它可以工作,但是...如果我以" Administrator "身份运行该应用程序,则即使我提供了所有权限,外部应用程序也无法调用OpenProcess。我很合理,因为具有较低管理员权限的进程无法打开具有管理员权限的进程。
-
可能您应该检查在" Administrator "下运行的进程的安全描述符,以查找拒绝条目(如ACE),并以与添加条目相同的方式完全删除该条目。
这是您要完成的事情吗?
在"外部"过程中创建一个共享内存块。
使用DuplicateHandle在您的应用程序中创建该内存的句柄
使用窗口消息将句柄值发送到您的应用程序
访问应用程序中的共享内存
如果我正确理解,那么您根本不需要打开申请过程的句柄。而是给共享内存块一个确定性的名称,例如SharedMem_XXX,其中XXX是外部进程的PID。然后,使用窗口消息将PID发送到您的应用程序。然后,它可以重新创建名称,并使用它打开共享内存块。
- 不错的解决方案,但这仅在使用SendMessage时有效,而在使用PostMessage时无效,因为应用程序可以在应用程序处理消息之前发送多个消息。我尝试用SendMessage替换PostMessage,然后查看系统性能是否受到影响。谢谢你的启发!
-
别客气。我不太了解PostMessage和SendMessage的含义,但这可能与您的体系结构有关。如果您可以提供有关您要完成的工作的更多详细信息,那么我可能会有所帮助。
-
根据实际操作,还有其他IPC机制可能会更适合您的需求,例如窗口消息,命名管道或远程过程调用。