我正在编写一个Windows服务( Delphi XE2 ),它调用第三方COM
库中的函数。 COM
库的核心很旧,需要将驱动器号映射到其数据文件的位置。它绝对不适用于UNC
路径。在我的服务中,我在服务开始时连接驱动器号以确保它可用。我正在使用WNetAddConnection2
API调用,并检查返回值。除非已使用驱动器号(ERROR_ALREADY_ASSIGNED
),否则驱动器已成功连接,但在任何一种情况下COM功能都可正常运行。我所遇到的问题源于服务停止时的问题。如果在服务停止(WNetCancelConnection2
)并且服务器上的其他应用程序/服务正在使用驱动器号时断开驱动器,则它们会受到影响并失去连接。但是,如果我在服务停止时没有断开驱动器,则驱动器“丢失”并且无法通过其他服务连接。
我确信这与创建它们的会话/服务“拥有”驱动器映射的方式有关,但我不确定正确的解决方案是什么。我目前正在'Local System'下启动该服务。我知道Microsoft一直建议服务不使用映射驱动器,但我没有选择。有没有人在遇到过这个问题并提出任何建议?
答案 0 :(得分:4)
我目前正在“本地系统”下启动该服务
尝试使用其他用户帐户。
由于安全原因,Windows Local System保持本地 - IOW禁止网络访问
答案 1 :(得分:0)
尝试:
您可以找到更多信息here。
*在工作组中,此帐户必须在目标计算机上镜像+ security model on the destionation PC must be set to "Classic" using GPEdit
答案 2 :(得分:0)
驱动程序字母是按用户分配的。服务的驱动器号分配可能影响其他应用程序/服务的唯一方法是它们都在同一用户帐户中运行。应用不会在LocalSystem
帐户中运行,除非它们由以LocalSystem
运行的服务启动(但用户无法看到它们)。因此,如果您希望将服务的驱动器号分配仅与您的服务隔离,则为您的服务创建一个专用的用户帐户。这也使您能够自定义该用户帐户的权限,以便它具有网络访问权限如果实际不需要,则无需完整的系统访问。