跨域访问命名管道
版本 |
创建时间 |
创建人 |
备注 |
1.0.0604.1 |
2003-6-4 |
郑 昀 |
第一稿 |
|
|
|
|
本文档将说明如何跨越两个互相不信任的Windows 2000 域使用命名管道。问题最终解决,我有幸记录下了排查、解决问题的全过程。
继续阅读之前,我们假设您熟悉以下知识:
n Named Pipe
n Access Control List
n Discretionary Access Control List
n IIS 5.0
同事遇到了这么一个问题:
“我做了一个com(dll),这个com将被asp调用,连接到一个namedpipe。现在遇到了一些访问权限问题:
COM和namedpipe位于同一个计算机
使用iis,则com不能访问管道,错误代码是:5,Access is denied.
COM和namedpipe位于不同的域中的计算机,IIS与COM位于同一个计算机
使用vbs测试,com不能访问管道,错误代码:1326,Logon failure: unknown user name or bad password
使用iis,不能访问..错误代码是:5,Access is denied.
COM和namedpipe位于不同的域中的计算机
但在COM所在计算机上使用 net use \\server2\pipe /USER:xxx
指定了用户名,密码之后
使用vbs测试,com可访问管道
使用iis,不能访问..错误代码是:5,Access is denied.
综合起来,问题在于IIS进程调用的COM,访问另外的程序创建的命名管道时候,因权限问题而无法访问。”
需要做两步:
u 管道服务器端 在创建命名管道的时候,要明确指定DACL为NULL。如果不指定这一步,客户端将返回错误码:5(拒绝访问)。事实上只有管道创建者才可以访问管道。
u 客户端 客户端连接之前,使用WNetAddConnection2 进行网络连接登录。实际测试中发现,如果不进行这一步,运行结果返回错误码:1326。