Windows C ++删除缓存凭据

时间:2014-05-13 17:52:10

标签: c++ windows winapi caching credentials

我们正在使用

这是一个有趣的问题
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.如果不重新启动整个系统,找到摆脱这些凭据的方法会很高兴......

0 个答案:

没有答案