为什么WNetAddConnection2在成功调用WNetCancelConnection2后仍然返回1219?

Yan*_*Luo 9 c++ windows winapi active-directory

我写了一些代码来连接远程服务器上的某些共享.如果WNetAddConnection2返回ERROR_SESSION_CREDENTIAL_CONFLICT(1219),我将首先取消连接WNetCancelConnection2(返回NO_ERROR).然后重新连接.但WNetAddConnection2仍然回归1219.为什么这个以及如何解决它?

这是我的代码

BOOL ADDirectorySearch::IPCConnect(CString strServerName, CString strDomainName, CString strUserName, CString strPassWord)
{
    CString strServerNameWithSlash = _T("\\\\") + strServerName; //actually is \\klbnt
    CString strFullUserName = strDomainName + _T("\\") + strUserName; //is domaintest\administrator
    _bstr_t bstrServerNameWithSlash = strServerNameWithSlash;
    _bstr_t bstrFullUserName = strFullUserName;
    _bstr_t bstrPassWord = strPassWord;
    DWORD dwResult;
    NETRESOURCEW netResource;
    memset(&netResource, 0, sizeof(netResource));
    netResource.dwScope = RESOURCE_GLOBALNET;  
    netResource.dwType = RESOURCETYPE_DISK;
    netResource.dwDisplayType = RESOURCEDISPLAYTYPE_GENERIC;  
    netResource.dwUsage = RESOURCEUSAGE_CONNECTABLE;
    netResource.lpProvider = L"";
    netResource.lpRemoteName = bstrServerNameWithSlash;//Remote IP like:\\192.168.1.11
    dwResult = WNetAddConnection2W(&netResource, bstrPassWord, bstrFullUserName, CONNECT_INTERACTIVE);
    if (dwResult == ERROR_SESSION_CREDENTIAL_CONFLICT)
    {
        dwResult = WNetCancelConnection2W(bstrServerNameWithSlash, CONNECT_UPDATE_PROFILE, TRUE);
        if (dwResult == NO_ERROR)
        {
            dwResult = WNetAddConnection2W(&netResource, bstrPassWord, bstrFullUserName, CONNECT_INTERACTIVE);
        }
        else
        {
            //MyMessageBox_Error(_T("IPCConnect Error."), _T("Error"));
            return FALSE;
        }
    }
    if (dwResult == NO_ERROR)
    {
        return TRUE;
    }
    else
    {
        //MyMessageBox_Error(_T("IPCConnect Error."), _T("Error"));
        return FALSE;
    }
}
Run Code Online (Sandbox Code Playgroud)

仅供参考:在cmd中键入"net use"后,我得到了这个,我觉得有些错误:

Status       Local     Remote                    Network

-------------------------------------------------------------------------------
OK                     \\klbnt\NRDC1001          Microsoft Windows Network
The command completed successfully.
Run Code Online (Sandbox Code Playgroud)

Dyl*_*son 5

我现在才遇到这个问题,基本上似乎是由于另一个进程仍然打开文件,即使我指定"true"为的最后一个参数WNetCancelConnection2()强制关闭连接。一旦我关闭了其他进程,我就能够成功地在连接和重新连接到同一共享的凭据之间切换。这是在 Windows 2012(64 位)上,共享是本地的(由机器名引用)。

但是...如果您想连接到同一台机器上的不同共享,这仍然是一个问题。如果我尝试连接到\\mymachine\share1asuser1然后到\\mymachine\share2as user2,我会收到 1219 错误(即使它处于完全不同的过程中)。我必须显式调用WNetCancelConnnection\\mymachine\share1之前,我可以连接到share2你连接到共享特定的机器上的点,这意味着,你可能必须首先枚举现有的连接并关闭各一台。

相当令人沮丧,我无法理解这里的设计原则。似乎创建临时连接等的标志对这种行为也没有影响。我真正想要做的是说“对于这个线程,连接到这台机器上的这个共享,并且作为这个用户,这样所有访问共享上的文件的尝试都是使用该用户的凭据完成的”。这样其他进程/线程正在做的事情不会导致当前进程/线程出现问题。