2

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

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

4

3 回答 3

4

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

尝试不同的用户帐户。

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

于 2013-01-23T11:33:55.923 回答
0

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

于 2013-01-23T18:49:33.700 回答
0

尝试:

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

你可以在这里找到更多信息。

*在工作组中,此帐户必须在目标计算机上进行镜像+目标PC 上的安全模型必须使用 GPEdit 设置为“经典”

于 2013-01-23T13:14:06.477 回答