我有一个在登录用户的上下文中运行的exe.exe使用WCF使自己成为命名管道服务器(它将由多个客户端调用).
用户是否需要exe的特定权限才能创建命名管道?我尝试以相对最小的权限(即仅在本地Users组中)作为用户运行,并且这很好 - 但是我担心当我部署到客户端站点时,用户可能会以某种方式受到限制表示命名管道创建不起作用.
鉴于:
- 应用程序 - 桌面GUI(WPF).NET应用程序
- 监视应用程序的Windows服务(.NET也)
Windows服务定期"ping"应用程序以确保它是健康的(如果它不是winservice将重新启动它).
我打算通过命名管道实现"pinging".为了简单起见,我决定使用WCF.该应用程序托管一个WCF服务(一个操作Ping返回一些东西).Windows服务是此WCF服务的客户端,基于计时器定期调用它.
这一切都在Windows 7中
.Windows服务在LocalService下运行(在会话#0中).
桌面应用程序在当前登录的用户下运行(在会话#1中).
问题:
Windows服务无法在桌面应用程序中看到创建并正在侦听的WCF端点(使用NetNamedPipeBinding).这意味着通过wcf代理调用时,我得到了这个异常:"在本地计算机上找不到管道端点'net.pipe:// localhost/HeartBeat'"
我确信代码没问题,因为另一个桌面应用程序(在会话#1中)可以看到端点.
显然,我在处理Win32系统对象隔离的一些安全性问题.但我相信应该有办法解决我遇到过的限制问题.
我可以牺牲WCF方法并采用原始的NamedPipe方式.
我正在运行一个Windows服务,我通过NetNamedPipeBinding发送消息.消息从客户端应用程序发送,该应用程序由GPO触发.我刚刚在新服务器上安装了服务和客户端,我收到以下消息:
System.ServiceModel.EndpointNotFoundException:
There was no endpoint listening at
net.pipe://localhost/VOXAServices/VOXADefaultPipe that could accept the
message. This is often caused by an incorrect address or SOAP action.
See InnerException, if present, for more details.
Run Code Online (Sandbox Code Playgroud)
没有内在的例外.如果我通过双击桌面上的图标运行客户端应用程序,它运行没有问题.我管理Windows服务和客户端应用程序的代码,所以我可以改变我需要的任何东西.但到目前为止,我非常确信绑定,合同和地址都是正确的(因为从桌面运行时一切运行正常).我认为问题必须是从GPO运行客户端应用程序.但我想不出有什么理由会导致这个错误.
更新:
我在微软的网站上看到了这个:
命名管道是Windows操作系统内核中的对象,例如进程可用于通信的共享内存部分.命名管道具有名称,可用于单台机器上的进程之间的单向或双工通信.
当在一台计算机上的不同WCF应用程序之间需要通信,并且您希望阻止来自另一台计算机的任何通信时,请使用命名管道传输.另一个限制是,从Windows远程桌面运行的进程可能被限制为同一个Windows远程桌面会话,除非它们具有提升的权限.
(选择运输,增加重点)
我需要客户端进程在(非特权)用户的上下文中运行,并且弹出UAC对话框不是一个选项.无论如何,我是否允许此客户端进程提升特权,同时保持进程在用户上下文中运行而不是使用户具有特权?
更新#2:
似乎存在全局和本地(对于Windows会话)命名管道这样的事情.我相信我的Windows服务正在创建一个本地命名管道,如果我可以强制它创建一个全局命名管道,它将解决我的问题.(这解释了为什么我在sysinternals"Process Explorer"中看不到我的管道,即使我的客户端应用程序可以找到它,如果我从特权会话启动它).问题是,我不知道(并且似乎无法找到)如何强制全局创建命名管道(c#).有任何想法吗?