我尝试在远程机器上打开一个文件,看起来像这样:
#include <Windows.h>
#include <cwchar>
int main() {
HANDLE h = CreateFileW (
L"\\\\10.10.10.10\\c$\\windows\\system32\\calc.exe",
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
nullptr,
OPEN_EXISTING,
0,
nullptr);
if (h == INVALID_HANDLE_VALUE) {
std::wprintf(L"Error: %u\n", GetLastError());
} else {
CloseHandle(h);
}
}
问题是:失败,GetLastError ()
返回1326(用户名或密码无效)。
我尝试过的:
NetUseAdd
,用于IPC$和C$,具有本地管理员凭据(均成功连接)WNetAddConnection2
,用于IPC$和C$,具有本地管理员凭据(均成功连接)
根据远程计算机的事件日志,CreateFile
尝试使用启动该进程的用户的凭据。
我应该做些什么才能让CreateFile
使用提供的凭据?
是的,我尝试连接到C$共享,它可以从Explorer完成。
1条答案
按热度按时间mum43rcc1#
简短回答:
LogonUser
+ImpersonateLoggedOnUser
。TL;DR
大多数能够与远程计算机一起工作的Windows API通常可以使用
WNetAddConnection*
系列或NetUseAdd
安装IPC$
共享。但也有例外。其中一个是
CreateFile
。此函数将忽略已建立的IPC$
连接以及任何已建立的共享连接。您需要使用LogonUser
+ImpersonateLoggedOnUser
对。我应该指出,微软网站上对
LogonUser
的描述可能会产生误导。说 “您无法使用LogonUser登录到远程计算机” 是正确的。它实际上可以做的是准备网络凭据,以便将来连接到远程计算机。实际登录将在以后的API调用期间发生(在本例中为CreateFile
)。