我正在编写一个Windows服务(Delphi XE2),它调用第三方COM
库中的函数。 COM
库的核心相当陈旧,需要将驱动器号映射到其数据文件的位置。 它绝对不适用于UNC
路径。 在我的服务中,我在服务启动时连接驱动器号,以确保它可用。 我正在使用WNetAddConnection2
API 调用,并检查返回值。 驱动器连接成功,除非驱动器号已在使用中(ERROR_ALREADY_ASSIGNED
),但无论哪种情况,COM 功能都运行良好。 我遇到的问题源于服务停止时。 如果我在服务停止(WNetCancelConnection2
)时断开驱动器的连接,并且服务器上的其他应用程序/服务正在使用驱动器号,则它们会受到影响并失去连接。 但是,如果我在服务停止时不断开驱动器,则驱动器将"丢失"并且无法通过其他服务连接。
我确信这与创建它们的会话/服务如何"拥有"驱动器映射有关,但我不确定正确的解决方案是什么。 我目前正在"本地系统"下启动该服务。 我知道Microsoft一直建议服务不使用映射驱动器,但我别无选择。 以前有没有人遇到过这个问题并有任何建议?
我目前正在"本地系统"下启动服务
尝试其他用户帐户。
由于安全原因,Windows本地系统保持本地 - IOW禁止网络访问
尝试:
- 为连接专用一个用户帐户* ;
- 将此用户传递给 WNetAddConnection2;
您可以在此处找到更多信息。
*在工作组中,此帐户必须在目标计算机上镜像 + 必须使用 GPEdit 将 PC 上的安全模型设置为"经典"
字母是按用户分配的。 服务的驱动器号分配可能影响其他应用/服务的唯一方式是它们是否都在同一用户帐户中运行。 应用不会在 LocalSystem
帐户中运行,除非它们由以LocalSystem
方式运行的服务启动(但这样它们对用户不可见)。 因此,如果要将服务的驱动器号分配仅隔离到服务,请为服务创建一个专用用户帐户以在其中运行。 这还使您能够自定义该用户帐户的权限,以便它具有网络访问权限,而无需在实际需要时进行完全系统访问。