gpt4 book ai didi

c++ - 为什么WNetAddConnection2调用WNetCancelConnection2成功后还是返回1219?

转载 作者:可可西里 更新时间:2023-11-01 12:44:06 25 4
gpt4 key购买 nike

我写了一些代码来连接远程服务器上的一些共享。如果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;
}
}

仅供引用:在cmd中输入“net use”后,我得到了这个,我觉得有些地方有错误:

Status       Local     Remote                    Network

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

最佳答案

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

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

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

关于c++ - 为什么WNetAddConnection2调用WNetCancelConnection2成功后还是返回1219?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11493345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com