Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Web Server 2008 R2上的Datasnap/DCOM_Windows_Delphi_Dcom_Datasnap - Fatal编程技术网

Windows Web Server 2008 R2上的Datasnap/DCOM

Windows Web Server 2008 R2上的Datasnap/DCOM,windows,delphi,dcom,datasnap,Windows,Delphi,Dcom,Datasnap,相同的设置适用于Windows 7/64位和Windows Server 2008/64位: Datasnap服务器应用程序位于安装的网络驱动器上 在tregsvr中注册:\path\to\server.exe(作为管理员) GUID显示在dcomcnfg中 Socketserver和DCOM服务正在运行 客户端失败,错误消息为“未注册类” 如果我将服务器应用程序移动到本地目录,并重复tregsvr注册,客户端可以毫无问题地连接 我还可以检查什么?是否允许客户端连接到网络驱动器?由于客户端实

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

  • Datasnap服务器应用程序位于安装的网络驱动器上
  • 在tregsvr
    中注册:\path\to\server.exe
    (作为管理员)
  • GUID显示在dcomcnfg中
  • Socketserver和DCOM服务正在运行
客户端失败,错误消息为“未注册类”

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


我还可以检查什么?

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

  • tregsvr指向Datasnap服务器网络位置的UNC路径(而不是装入的网络驱动器)
  • 以系统帐户运行Socketserver是可以的,不需要额外的权限
从服务器注销后,Datasnap客户端仍然可以愉快地与服务器连接

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

  • 服务器不得位于任何共享网络驱动器中
  • 您必须在客户端注册服务器类型库,否则客户端的DCOM将无法理解要实例化的类以及如何在网络上整理其调用。DCOM负责请求服务器实例化服务器应用程序
  • 在DCOM连接中,您必须知道服务器的位置(IP或主机名)
  • DCOM必须正确配置:使用DCOMcnfg.exe配置哪些用户/组可以实例化和调用服务器

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

    IIUC客户端首先连接到Borland socketserver,然后启动DCOM服务器-因此我发现Socketservice帐户有问题(不应该是系统,而应该是可以访问网络资源的用户)不需要。不需要从客户端访问服务器exe。它是服务器上的DCOM,接收客户端的请求以实例化服务器。不需要使用共享驱动器,这只是一个安全漏洞。这样,您只需在客户端上运行服务器,作为存储在远程驱动器上的本地应用程序,一切都在clie上运行nt,网络上没有DCOM调用。请注意套接字服务器:1)所有操作都在scktsrv.exe服务用户的安全上下文中运行(不要作为localsystem运行!)2)它不正确支持64位整数。它将覆盖内存并返回错误的结果。使用普通DCOM,尤其是在局域网中,由于防火墙等原因不需要通过单个TCP/IP端口进行通信时。@ldsandon它是一个不能很快更换的旧系统。Socketserver在推出时曾被宣传为访问MIDAS(现在的Datasnap)服务器的好方法,我们使用了它。现在,它似乎有点像BDE:)如果可以的话,摆脱DCOM。这是一种不推荐使用的技术,Windows7和2008Server不喜欢它。您需要在PC上强制使用SMB 1协议,即使这样,我们也遇到了很多问题。请参阅我如何同时为几个Delphi 5应用程序将其替换为HTTP服务。@Arnaud谢谢(DCOM已成为历史),我们也将转到HTTP。我使用DCOM 7和2008 R2时没有任何问题。如果它不起作用,许多Windows工具本身将无法工作-许多远程管理工具通过RPC或DCOM工作。不需要强制SMB1,这没有意义。DCOM与AD安全性紧密集成,而HTTP则不是。这是因为注册服务器实际上注册了类型库。您只需注册服务器类型库,无需从客户端访问server.exe。这就是RPC和DCOM的全部内容。无论如何,以系统方式运行意味着服务器中的任何缺陷都将使其能够使用最具特权的帐户之一进行演示。祝你好运。客户端没有TDCOMConnection组件,只有一个TSocketConnection-如果我理解正确,Socketserver不是一个简单的DCOM代理(与真正的DCOM服务器具有相同的API),而是某种隧道技术。它不是隧道,因为它实际上是执行DCOM调用的套接字服务器(丢失整个DCOM安全实施)。客户端标识已丢失。无论如何,客户端仍需要了解DCOM接口,其类型库必须在客户端注册,尤其是在应用程序使用早期绑定的情况下。通过IDispatch进行的后期绑定应该可以工作,但类型库仍应加速方法绑定。请参阅,我们从未在clie上注册过库nt端(既不在内部也不在外部客户端计算机上)。用户只需启动客户端应用程序,并且考虑到端口211在防火墙中是开放的,它可以工作大约十年(从MIDAS 1开始)。我猜是后期绑定。是的,但这取决于调用客户端的编码方式。如果您查看我在上面发布的链接,有一种方法可以将接口转换为DispInterface,并稍微提高调用速度。IIRC需要类型库注册。但我多年前就停止使用socket服务器,因为它存在漏洞和安全问题(基本上,任何人都可以调用服务器)。