c++ 如何为CreateFile(共享文件)提供凭据?

uinbv5nw  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(129)

我尝试在远程机器上打开一个文件,看起来像这样:

#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完成。

mum43rcc

mum43rcc1#

简短回答:LogonUser + ImpersonateLoggedOnUser
TL;DR
大多数能够与远程计算机一起工作的Windows API通常可以使用WNetAddConnection*系列或NetUseAdd安装IPC$共享。但也有例外。
其中一个是CreateFile。此函数将忽略已建立的IPC$连接以及任何已建立的共享连接。您需要使用LogonUser + ImpersonateLoggedOnUser对。
我应该指出,微软网站上对LogonUser的描述可能会产生误导。说 “您无法使用LogonUser登录到远程计算机” 是正确的。它实际上可以做的是准备网络凭据,以便将来连接到远程计算机。实际登录将在以后的API调用期间发生(在本例中为CreateFile)。

相关问题