【问题标题】:Connecting a mapped drive letter in Windows service在 Windows 服务中连接映射的驱动器号
【发布时间】:2013-01-06 20:19:24
【问题描述】:

我正在编写一个 Windows 服务 (Delphi XE2),它调用第 3 方 COM 库中的函数。 COM 库的核心非常古老,需要将驱动器号映射到其数据文件的位置。它绝对不适用于UNC 路径。在我的服务中,我在服务启动时连接驱动器号以确保它可用。我正在使用WNetAddConnection2 API 调用,并检查返回值。驱动器已成功连接,除非驱动器号已在使用中 (ERROR_ALREADY_ASSIGNED),但无论哪种情况,COM 功能都可以正常运行。我遇到的问题源于服务停止时。如果我在服务停止 (WNetCancelConnection2) 并且服务器上的其他应用程序/服务正在使用驱动器号时断开驱动器,那么它们会受到影响并失去连接。但是,如果在服务停止时我没有断开驱动器,则驱动器“丢失”并且无法被其他服务连接。

我确信这与创建驱动器映射的会话/服务如何“拥有”驱动器映射有关,但我不确定什么是正确的解决方案。我目前正在 'Local System' 下启动该服务。我知道微软一直建议服务不要使用映射驱动器,但我别无选择。有没有人遇到过这个问题并有什么建议?

【问题讨论】:

    标签: delphi windows-services unc network-drive mapped-drive


    【解决方案1】:

    我目前正在“本地系统”下启动服务

    尝试不同的用户帐户。

    由于安全原因,Windows 本地系统保持为本地 - IOW 禁止网络访问

    【讨论】:

      【解决方案2】:

      试试:

      1. 为连接指定一个用户帐户* ;
      2. 将此用户传递给 WNetAddConnection2;

      您可以找到更多信息here。

      *在工作组中,此帐户必须在目标计算机上进行镜像 + security model on the destionation PC must be set to "Classic" using GPEdit

      【讨论】:

        【解决方案3】:

        驱动程序字母是按用户分配的。您的服务的驱动器号分配可能影响其他应用程序/服务的唯一方法是它们是否都在同一个用户帐户中运行。应用程序不会在LocalSystem 帐户中运行,除非它们由以LocalSystem 运行的服务启动(但随后它们对用户不可见)。因此,如果您希望将服务的驱动器号分配与您的服务隔离开来,请为您的服务创建一个专用的用户帐户以在其中运行。这还使您能够自定义该用户帐户的权限,使其具有网络访问权限如果实际上不需要,则不需要完整的系统访问权限。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-14
          • 1970-01-01
          相关资源
          最近更新 更多