正在进行重叠的I / O操作,并且多个服务以同一Windows用户身份运行

时间:2018-07-30 17:28:42

标签: windows service mapped-drive

我们正在运行多个Windows服务,每个服务都在同一Windows用户(不是LocalSystem)下。出于无法快速解释的原因,我们必须检查映射驱动器的存在并创建映射(如果不存在)。在生产环境中不允许使用UNC路径。

我们使用ManagementObjectCollection :: ManagementObjectEnumerator来检查映射驱动器是否存在,如果不存在映射,则使用WNetAddConnection2来创建映射(将驱动器号和驱动器路径提供给映射创建方法):

            net_resource% nr = *(gcnew net_resource);
            nr.dwScope = RESOURCE_GLOBALNET;
            nr.dwType = RESOURCETYPE_DISK;
            nr.dwDisplayType = RESOURCEDISPLAYTYPE_SHARE;
            nr.dwUsage = RESOURCEUSAGE_CONNECTABLE;
            nr.lpLocalName = driveLetter;
            nr.lpRemoteName = drivePath;
            nr.lpComment = String::Empty;
            nr.lpProvider = String::Empty;

            UInt32 flags = CONNECT_TEMPORARY;
            UInt32 ret = WNetAddConnection2(nr, nullptr, nullptr, flags);

服务调用的应用程序将依次创建其他应用程序的实例以处理特定操作。我们观察到,如果这些实例中有多个实例尝试访问映射的驱动器,则尝试将失败,并显示错误997:I / O重叠操作正在进行中。我发现Microsoft文档说明,即使用户对映射驱动器的访问权限相同,也可能在会话之间出现问题。

我将不胜感激,可以提供任何帮助,但是我必须再次说明,映射驱动器的使用是我们无法控制的力量所强制要求的,并且驱动器号必须是固定的,已知的。

放大: 服务A使用srvany运行应用程序A的实例 服务B使用srvany运行App A的实例

App A的任何一个实例都将调用App B或C的一个实例。

A,B和C通用的代码检查是否存在映射的驱动器,如果该驱动器不存在,则如上所述创建映射。

服务是否一起启动或之间是否有间隔都无关紧要,而应用B的一个实例是否等到应用B的另一个实例完成也无关紧要。

0 个答案:

没有答案