C#中使用命名管道通信失败

来源:互联网 发布:oracle 清除表数据 编辑:程序博客网 时间:2024/05/22 14:26
问题描述
单位上部署的程序,是本人和同事一起开发的。一个C#写的应用层托盘程序,另一个是虚拟打印机程序,两个程序之间用命名管道进行通信。平时用户使用正常,某次同事在本机上测试新开发的模块时,却发现有时候托盘程序和虚拟打印机之间无法通信。具体现象是如果用VS启动托盘程序,则托盘程序和虚拟打印机无法通信。如果是直接启动Debug文件夹中的exe程序,则两者之间通信正常。
问题定位
通过不断的调试、启动,发现VS启动托盘程序时是以管理员方式启动的(同事电脑操作系统为Win7),这时托盘程序和虚拟打印机之间无法通信,而直接启动Debug文件夹中的exe程序时是采用的当前用户的默认权限运行,这时通信正常。再进一步测试发现,如果要触发该类问题,需要同时满足三个条件:
1)用户账号具有管理员权限
2)用户操作系统中的用户账户控制设置为第三档或者更高(UAC)
C中使用命名管道通信失败 - gc_2299 - gc_2299的博客
 3)托盘程序以管理员方式运行
仅当同时满足这三个条件时才会触发该问题。通过查阅托盘程序代码,发现是创建命名管道服务时的问题。
问题解决方案
C#中的NamedPipeServerStream类有多个构造函数,如下图所示,具体的介绍可以参考文献1.这些函数中有些函数的参数时可以指定权限的。但是我在程序中使用的是最简单的构造函数,参数只有三个,管道名称、管道方向和管道实例数量,其它的都采用的该类的默认值。应该就是这个问题。不过后面我犯懒了,没有去写函数验证(因为在我们单位上满足该问题的三个条件不可能同时出现)。有兴趣的朋友可以写程序验证一下。
C中使用命名管道通信失败 - gc_2299 - gc_2299的博客
 
参考文献;
[1]https://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeserverstream(v=vs.110).aspx
[2]https://msdn.microsoft.com/zh-cn/library/bb546085(v=vs.110).aspx
原创粉丝点击