我们正在使用
这是一个有趣的问题WNetAddConnection2
使用某人的凭据连接到\\ server \ share并映射驱动器。当我们完成后,我们致电
WNetCancelConnection2
关闭并清除连接。我们发现了一个错误,如果有人使用凭据进行此操作然后使用未经身份验证的连接,我们会执行类似的操作(无凭据):
FILE *file = _wfopen(L"\\\\server\\share\\file.txt", L"r");
我不希望这会起作用,因为我们清理了连接,但Windows似乎在某处缓存它。我想知道我的代码中是否还有其他任何东西可以从WNetAddConnection2清除连接或手动删除缓存的连接?
请参阅下面的代码示例...
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <Winnetwk.h>
#include <string>
#ifndef UNICODE
#define UNICODE
#endif
#pragma comment(lib, "mpr.lib")
int main(int argc, char *argv[])
{
NETRESOURCE nr;
memset(&nr, 0, sizeof (NETRESOURCE));
nr.dwType = RESOURCETYPE_ANY;
nr.lpLocalName = L"L:";
nr.lpRemoteName = L"\\\\server\\share";
nr.lpProvider = NULL;
DWORD ret = WNetAddConnection2(&nr, pswd, user, CONNECT_TEMPORARY);
ret = WNetCancelConnection2(nr.lpLocalName, 0, TRUE);
// I would not expect this to work since we closed the connection from above.
FILE *file = _wfopen(L"\\\\server\\share\\file.txt", L"r");
if (NULL != file)
{
// WHAT?!
}
}
注意:到目前为止,仅在Windows Server 2008 R2上观察到此行为。在Windows 7和XP上,这将无法说&#34;未知用户或密码错误&#34; (这是我们所期望的)。 出于某种原因,我也没有看到凭证缓存显示在&#34; Credential Manager&#34;所以我不确定远程路径的身份验证方式或缓存凭据的来源。
更新(更多备注): 如果我们重新启动,则会清除缓存的凭据。该软件长时间运行,重启设备对人们来说非常不方便。看起来我需要一种方法来清除注册表中的连接缓存:&#34; HKLM \ SECURITY \ Cache&#34; ......这似乎非常黑客,我甚至不知道哪个缓存条目是我想清除的(它们只是列为&#34; NL $ n&#34;,其中n是1- 10.如果不重新启动整个系统,找到摆脱这些凭据的方法会很高兴......