【发布时间】:2017-02-03 15:08:17
【问题描述】:
我已经使用命名管道在两个应用程序之间创建了通信。
第一个应用程序使用CreateNamedPipe 创建一个命名管道,并读取第二个应用程序发送的带有ReadFile 的接收消息。两个应用程序都能够按照预期的方式进行通信。
是否有可能以某种方式识别收到的消息的发件人? 如果没有某种标识(例如获取发送者 exe 路径)或授权,其他所有应用程序都可以使用该管道向我的应用程序发送消息。
(编辑) 更多细节,因为在这种情况下似乎很重要:
创建管道的应用程序作为 Windows 服务运行。
两个应用程序在同一系统上本地运行。
【问题讨论】:
-
您必须自己实现。管道是安全对象,但 Windows 的安全模型不是面向应用程序的,而是面向用户的。
-
难道没有至少一种方法可以找出消息的来源吗?类似于通过命名管道发送消息的文件的句柄/名称/路径?
-
@CodeX 不直接。发送者必须在消息数据本身中识别自己。服务器唯一可以自行确定的是运行发送消息的应用程序的用户帐户。为此,服务器必须先impersonate the connected client,然后才能检索用户信息。如果服务器有足够的权限,它可能能够枚举本地系统上所有打开的句柄,查找该用户打开的任何句柄并指向您的服务器管道名称...
-
@CodeX ... 但这是一项非常复杂的任务,需要低级别的 API 和操作系统内部知识,并且无论如何只能用于本地进程,而不是网络上的远程进程。
-
ImpersonateNamedPipeClient存在。也存在 undocumentedFSCTL_PIPE_QUERY_CLIENT_PROCESS通过使用它我们可以获得打开命名管道的进程的 id
标签: winapi named-pipes