10

リモートサーバー上の共有に接続するためのコードをいくつか書きました。(1219) をWNetAddConnection2返す場合は、まず(return NO_ERROR) で接続をキャンセルします。そして、再接続します。しかし、それでも戻ります。なぜこれを修正するのですか?ERROR_SESSION_CREDENTIAL_CONFLICTWNetCancelConnection2WNetAddConnection21219

これが私のコードです

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;
    }
}

参考: cmd で「net use」と入力した後、これを取得しました。何かエラーがあるように感じます。

Status       Local     Remote                    Network

-------------------------------------------------------------------------------
OK                     \\klbnt\NRDC1001          Microsoft Windows Network
The command completed successfully.
4

1 に答える 1

5

私はちょうど今この問題を抱えていました。基本的には、最後のパラメーターとして接続を強制的に閉じるように指定したにもかかわらず、別のプロセスがまだファイルを開いていることが原因のようでした。他のプロセスをシャットダウンすると、資格情報の接続と同じ共有への再接続を正常に切り替えることができました。これは Windows 2012 (64 ビット) であり、共有はローカル (マシン名で参照) でした。"true"WNetCancelConnection2()

しかし...同じマシン上の異なる共有に接続したい場合は、まだ問題があります。asから\\mymachine\share1asに接続しようとすると、1219 エラーが発生します (まったく別のプロセスであっても)。に接続するには、明示的に呼び出す必要があります。つまり、特定のマシンの共有に接続する時点で、最初に既存の接続を列挙し、それぞれを閉じる必要がある場合があります。user1\\mymachine\share2user2WNetCancelConnnection\\mymachine\share1share2

むしろイライラするし、ここでの設計原理を理解できません。一時的な接続を作成するためのフラグなども、この動作には影響しないようです。本当に私ができるようにしたいのは、「このスレッドでは、このマシン上のこの共有に接続し、このユーザーとして、共有上のファイルにアクセスするすべての試みがそのユーザーの資格情報で行われるようにすることです」. そうすれば、他のプロセス/スレッドが行っていることが現在のものに問題を引き起こすことはありません。

于 2013-08-05T03:17:28.567 に答える