卸载然后立即重新安装SMB共享,​​因为不同的用户失败

时间:2012-02-17 16:33:04

标签: windows networking race-condition smb

我正在开发一个在Windows XP SP3上运行的MFC应用程序。其中一个要求是,当用户登录应用程序时,应用程序必须使用该用户的凭据挂载托管在Linux服务器上的多个SMB共享。

该程序具有“切换用户”功能,允许其他用户在不关闭应用程序的情况下登录,从而终止第一个用户的会话。发生这种情况时,必须卸载SMB共享,​​然后重新安装为新用户。

我们通过调用WNetCancelConnection2然后立即WNetAddConnection2来执行此操作。 WNetCancelConnection2返回NO_ERROR,表示成功。 但是,有时WNetAddConnection2无法将驱动器重新安装为新用户。使用FormatMessage从返回值中获取错误字符串会导致出现此错误消息,尽管事实如此WNetCancelConnection2似乎成功了:

  
    

不允许同一用户使用多个用户名与服务器或共享资源建立多个连接。断开之前与服务器或共享资源的所有连接,然后重试。

  

从命令提示符运行net use也不会显示与SMB共享的打开连接。

如果用户从不与已安装的驱动器进行交互,则不会发生此故障。只有当用户以某种方式访问​​了已安装的驱动器时才会出现这种情况,即用户在Windows资源管理器中打开已安装的驱动器。同样,如果您完全退出应用程序然后重新启动它并以另一个用户。

所有这些让我相信,在关闭网络资源的所有打开句柄之前,WNetCancelConnection2会返回竞争条件。我的问题是我可以在调用WNetCancelConnection2之后让我的程序阻塞或等待,直到所有这些句柄都关闭,保证WNetAddConnection2不会以这种方式失败吗?要么阻止API或忙于等待连接完全关闭的方法是可以接受的。要么优于sleep(),要么是最好的。 : - )

0 个答案:

没有答案