我想设计一个检查文件中某些文本的函数。它需要一个文件路径,该路径可以是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);
答案 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的一个潜在优势是,即使您在服务器上的凭据与本地计算机上的凭据不同,它也能正常工作。