【问题标题】:Datasnap/DCOM on Windows Web Server 2008 R2Windows Web Server 2008 R2 上的 Datasnap/DCOM
【发布时间】:2011-12-20 06:15:30
【问题描述】:

相同的设置适用于 Windows 7 / 64 位和 Windows Server 2008 / 64 位:

  • Datasnap 服务器应用程序位于已安装的网络驱动器上
  • 在 tregsvr <drive>:\path\to\server.exe 注册(作为管理员)
  • GUID 显示在 dcomcnfg 中
  • Socketserver 和 DCOM 服务正在运行

客户端失败并显示错误消息“类未注册”

如果我将服务器应用程序移动到本地目录,并重复注册tregsvr,客户端可以毫无问题地连接。

我还能检查什么?

【问题讨论】:

  • 注意套接字服务器:1) 一切都在 scktsrv.exe 服务用户的安全上下文中运行(不要将其作为本地系统运行!) 2) 确实如此不正确支持 64 位整数。它将覆盖内存并返回错误的结果。使用普通 DCOM 尤其是当您在 LAN 中并且由于防火墙等原因不需要通过单个 TCP/IP 端口进行通信时。
  • @ldsandon 这是一个不能很快被替换的遗留系统。 Socketserver 在推出时曾被宣传为访问 MIDAS(现为 Datasnap)服务器的好方法,我们使用了它。现在它似乎有点像 BDE :)
  • 如果可以的话,摆脱 DCOM。这是一项已弃用的技术,Windows 7 和 2008 Server 不喜欢它。您需要在 PC 上强制使用 SMB 1 协议,即便如此,我们还是遇到了很多问题。请参阅stackoverflow.com/questions/7647289/…,了解我如何将它替换为 HTTP 服务,同时用于多个 Delphi 5 应用程序。
  • @Arnaud 谢谢(DCOM 已成为历史),我们很快就会转向 HTTP
  • 我将 DCOM 与 7 和 2008 R2 一起使用,没有问题。如果它不工作,很多 Windows 工具本身就不能工作 - 许多远程管理工具通过 RPC 或 DCOM 工作。无需强制 SMB1,这没有意义。 DCOM 与 AD 安全性紧密集成,而 HTTP 则不然。

标签: windows delphi dcom datasnap


【解决方案1】:

是否允许客户端连接到网络驱动器?由于客户端实际上正在启动服务器,它应该能够读取该网络驱动器(这正是您所看到的,因为如果服务器在本地驱动器上它工作正常)...

【讨论】:

  • IIUC 客户端首先连接到 Borland Socketserver,然后启动 DCOM 服务器 - 所以我发现 Socketservice 帐户有问题(它应该不是 SYSTEM 而是可以访问网络资源的用户)
  • 没有。无需从客户端访问服务器 exe。服务器上的 DCOM 从客户端接收请求以实例化执行此操作的服务器。无需使用共享驱动器,这只是安全漏洞。这样一来,您最终只需在客户端上将服务器作为存储在远程驱动器上的本地应用程序运行,一切都在客户端上运行,网络上没有 DCOM 调用。
【解决方案2】:
  1. 服务器不得位于任何共享网络驱动器中
  2. 您必须在客户端注册服务器类型库,否则客户端的 DCOM 将无法理解要实例化的类以及如何通过网络编组其调用。由 DCOM 负责请求服务器实例化服务器应用程序。
  3. 在 DCOM 连接中,您必须知道服务器的位置(IP 或主机名)。
  4. 必须正确配置 DCOM:使用 DCOMcnfg.exe 配置哪些用户/组可以实例化和调用服务器

如果您使用的是套接字服务器,它实际上充当代理。是套接字服务器代表客户端进行 DCOM 调用,但调用仍被封装在发送到套接字服务器的数据包中。

【讨论】:

  • 我们在客户端没有 TDCOMConnection 组件,只有一个 TSocketConnection - 如果我理解正确的话,Socketserver 不是一个简单的 DCOM 代理(它与真正的 DCOM 服务器具有相同的 API)而是某种隧道技术。
  • 它不是隧道,因为它实际上是执行 DCOM 调用的套接字服务器(丢失了整个 DCOM 安全实现)。客户端身份丢失。无论如何客户端仍然需要了解 DCOM 接口,它的类型库必须在客户端注册,特别是如果应用程序使用早期绑定。通过 IDispatch 进行后期绑定应该可以工作,但是类型库无论如何都应该加速方法绑定。见docwiki.embarcadero.com/RADStudio/en/Calling_Server_Interfaces
  • 我们从来不需要在客户端注册库(无论是在内部还是在外部客户端计算机上)。用户只需启动客户端应用程序 - 鉴于端口 211 在他们的防火墙中打开 - 它工作了大约十年(从 MIDAS 1 开始)。我猜是后期绑定。
  • 是的,但这取决于您如何对呼叫客户端进行编码。如果您查看我在上面发布的链接,有一种方法可以将接口转换为 dispinteface 并稍微提高调用速度。需要类型库注册的 IIRC。但是几年前我停止使用套接字服务器,因为它的错误和安全问题(基本上,任何人都可以调用服务器)。
【解决方案3】:

已解决:

  • tregsvr UNC 路径指向 Datasnap 服务器的网络位置(而不是已安装的网络驱动器)
  • 以 SYSTEM 帐户运行 Socketserver 即可,无需额外权限

从服务器注销后,Datasnap 客户端仍然愉快地与服务器连接

其他/旧服务器正在将 Socketserver 作为具有必要权限的应用程序运行:P

【讨论】:

  • 之所以有效,是因为注册服务器实际上注册了类型库。您只需要注册服务器类型库,无需从客户端访问服务器 .exe。这就是 RPC 和 DCOM 的全部意义所在。无论如何,以 SYSTEM 身份运行意味着您的服务器中的任何缺陷都将使其可以被特权最高的帐户之一利用。祝你好运。
猜你喜欢
  • 1970-01-01
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多