提示CreateFile的凭据

时间:2015-02-23 18:35:36

标签: c++ windows winapi

我想设计一个检查文件中某些文本的函数。它需要一个文件路径,该路径可以是UNC路径,例如\ path \ to \ file \ share。

它也将使用当前用户凭据。我想要做的是能够提示用户使用新的凭据;在伪代码中

hCreds = NULL;
if (!fAutoLogon) { hCreds = PromptForCredentials(); }

hFile = CreateFile( pszFile, GENERIC_READ, FILE_SHARE_READ ,
                    NULL, OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL, NULL , hCreds);

2 个答案:

答案 0 :(得分:4)

使用CredUIPromptForCredentials()CredUIPromptForWindowsCredentials()获取用户的凭据,然后使用LogonUser()ImpersonateLoggedOnUser()模拟该用户,然后使用您的UNC路径呼叫CreateFile() ,然后最后调用RevertToSelf()以在关闭文件后停止模拟。

答案 1 :(得分:1)

您可以使用WNetAddConnection3()连接到网络共享:

    NETRESOURCE nr;

    nr.dwType = RESOURCETYPE_ANY;
    nr.lpLocalName = NULL;
    nr.lpRemoteName = dcpath;
    nr.lpProvider = NULL;

    dw = WNetAddConnection3(NULL, &nr, NULL, NULL, CONNECT_INTERACTIVE | CONNECT_PROMPT);

这将提示输入凭据。我相信路径字符串必须指向目录而不是文件;通常它只是\\server\share

如果连接成功,则可以使用CreateFile()打开文件。 MPR将自动使用现有连接。

完成文件使用后,您应该使用WNetCancelConnection()与服务器断开连接。

这种方法相对于Remy的一个潜在优势是,即使您在服务器上的凭据与本地计算机上的凭据不同,它也能正常工作。