使用命名管道的WCF安全问题(WCF security problems with named pi

2019-07-29 03:44发布

我有一个稍微复杂的设置,当然,工作在XP正常,但电抗器在Windows 7上这似乎是疯狂的,但它在当时是有道理的!

我有一个WPF应用程序启动,然后启动与外部设备通信的另一应用程序。 启动后,它通过建立一个命名管道(net.pipe)使用WCF新进程(通过新工艺主办)通信。 这似乎任何操作系统上正常工作。

我想提出一些可供外部使用的命令行程序的WPF应用程序的功能,所以我成立了另一个WCF服务,这次是由WPF应用程序托管,并再次通过命名管道暴露它。 同样,这似乎工作。

接下来,我想使通过网络提供的WPF应用程序的功能。 现在,它是WPF应用程序从一个普通用户帐户运行的很重要的,所以我想如果要对Windows 7的这项工作将是创建一个Windows服务,将提供网络服务部分的最佳方式,并把它传达回通过相同的命名管道的命令行工作正常WPF应用程序。 我实现了这一点,它运行良好的XP,但它闷死在Windows 7的问题似乎是试图建立窗口服务和WPF应用程序之间的命名管道连接。

如果我运行WPF应用程序作为管理员,它工作正常。 因此,它似乎是与帐户有关的问题,即服务在运行Windows不能与通过命名管道托管WCF服务普通用户帐户通信。 有没有一种方法,使这项工作? 这似乎在普通用户帐户使用命名管道在同一帐户运行的其他应用程序可以运行传达一个WCF服务,但现在看来,这不能做同样的事情用不同的账户。

奇怪的是,反向似乎工作。 Windows服务呢,其实,也有一个命名管道绑定(它是因为该服务正在运行的所有时间用作激活功能)提供一个服务。 我可以从WPF应用程序连接到这个服务没有任何问题。

我的安全知识是比较有限的。 任何人都可以照到这是怎么回事光?

Answer 1:

这个问题已经被问了几次以前在SO。 例如,看到通过命名管道连接从Windows服务桌面应用程序

问题是,你的用户会话的应用程序不具备必要的安全SeCreateGlobalPrivilege特权,让他们在全球的核心命名空间其他会话可见创建对象,但只能在本地命名空间这是只有在会话中可见。 服务,而另一方面,与此权限默认情况下运行,可以这样做。

它不是命名管道对象本身,这是限制以这种方式局部名字空间,但另一个名为内核对象,共享内存部分,对其中的命名管道WCF约束力的依赖,以发布到客户的实际名称管,这是一个GUID每个服务启动时都会改变。

您可以通过颠倒角色避开这个约束 - 使Windows服务应用程序的WCF服务,您的用户会话的应用程序连接的。 Windows服务没有问题公布其服务到您的会话。 而这种方式连接的东西了一轮更有意义,因为Windows服务一直在运行,而您的会话和应用程序来,当你登入和登出去。 你要与双工协定定义服务,这样一旦建立连接,通信在WCF服务的基本流程仍然可以在你原本打算向同一方向发生。



Answer 2:

该应用程序(WPF /控制台)创建局部范围命名管道(这发生在默认情况下,当他们无法创建全局范围的管道)。 我的猜测是,他们可以互相沟通,因为他们可以看到,因为它们是在同一帐户下运行的命名管道对方。

Windows服务具有更高的权限,因此可以创建客户端应用程序看到一个全局范围的命名管道。

你可以看看在讨论基督教维耶尔的博客 。



文章来源: WCF security problems with named pipes