一、问题带入:
从delphi 5开始,有许多人都面临过这样的问题:com应用开发出来并且在本机上运行一切正常,
但是一旦分发出去实施远程访问时,就无法正常运行了。我自己有段时间在看到“拒绝访问”错误提示时
会本能的头晕。其实认真追究起来,还是因为自己对windows安全技术了解不多造成的。多年来我一直
没有发现国内有windows安全方面比较系统的资料和书籍,直到Keith Brownr的<windows安全性编程>
中文版的出现。
1、Delphi默认com+对象的远程激活
Delph中远程com+对象激活一般通过TdispatchConnection及其子类来实现,实际代码中多用
TDCOMConnection或TsocketConnectoion这两个组件,TDCOMConnection组件最终调用CoCreateInstanceEx
创建com+对象。CoCreateInstanceEx(const clsid: TCLSID; unkOuter: IUnknown; dwClsCtx: Longint;
ServerInfo:PCoServerInfo;dwCount: Longint; rgmqResults: PMultiQIArray): HResult。
TDCOMConnection在调用CoCreateInstanceEx时为pCoServerInfo参数中的pAuthInfo传递了Null值,
因此TdcomConnection在创建Com对象时使用的是本地计算机登录者的用户令牌。
假若A计算机上的登录用户Auser使用TDCOMConnection类连接远程计算机B上的com+对象,
则B计算机会使用Auser的用户名/密码在B计算机上建立登录会话并最终创建com+对象。
但是一台windows工作站上的本地用户只能在本地登录而无法在别的计算机上登录,
因此A计算机上的Auser就无法在B工作站上建立登录会话,当然也就无法创建com+对象,
此时远程工作站B会尝试用Guest帐户建立会话并使用该账户激活com+对象。
在这种情况下,如果B工作站上的Guest账户没有启用或Guest没有激活com+对象的权限,
你就会看见令人头晕的提示“拒绝访问”。
看到这里你是不对现在网上最“流行”的dcom配置方法有所悟了呢。那个方法就是允许everyone访问、
激活com对象、并且将“默认身份验证级别”设置成无。
这种方法能够使你的com应用可以“用了”,但是,它可以上“任何人”访问。
而且这种设置你将无法利用com+基于角色的安全访问控制功能。