在Windows服务中连接映射的驱动器号

时间:2013-01-23 11:10:35

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

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

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

3 个答案:

答案 0 :(得分:4)

  

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

尝试使用其他用户帐户。

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

答案 1 :(得分:0)

尝试:

  1. 为用户帐户专用连接*;
  2. 将此用户传递给WNetAddConnection2;
  3. 您可以找到更多信息here

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

答案 2 :(得分:0)

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