win32 - 以编程方式访问远程计算机上的文件

第一步,在一台计算机上将某个驱动器或者某个文件夹设为sharing模式。这是我们需要访问的共享文件夹。(不需要设置everyone权限)

第二步,我们需要为两台在同一domain下的计算机上建立连接。

使用 Net use 指令,我们可以在代码中添加该指令,具体参数请见文档。 或者我们从cmd中快捷创建。

 

C:\WINDOWS\system32>net use \\ShareFolder /user:username password

 

需要说的是,ShareFolder是指共享文件夹或者驱动器的路径, username password是该计算机上的登录名和密码。

当返回 The command completed successfully. 说明建立成功。

 

第三步,使用LogonUser()登录到所需的用户帐户,并获得一个令牌,然后传递令牌ImpersonateLoggedOnUser()来冒充该用户,然后调用CreateFile()(将使用模拟的权利),并使用该文件根据需要,然后关闭该文件并调用RevertToSelf()到停止假冒。

各个api的使用参阅文档介绍,下面我会给出代码示例。

#include <Windows.h>
#include <iostream>

using namespace std;

int main()
{
    HANDLE hToken;

    BOOL dwRet  = LogonUser(L"usrname", L"domain", L"password", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &hToken);
    dwRet = ImpersonateLoggedOnUser(hToken);
    int err = GetLastError();
    
    HANDLE h = CreateFile(L"shareFolder_path",    // name of the file, suach as: \\\\xxx\\share\\test.txt
        GENERIC_READ | GENERIC_WRITE, // open for writing
        0,             // sharing mode, none in this case
        0,             // use default security descriptor
        CREATE_ALWAYS, // overwrite if exists
        FILE_ATTRIBUTE_NORMAL,
        0);
    err = GetLastError();
    if (h)
    {
        std::cout << "CreateFile() succeeded\n";
        CloseHandle(h);
    }
    else
    {
        std::cerr << "CreateFile() failed:" << GetLastError() << "\n";
    }

    RevertToSelf();
    return 0;
}

  

如果上面没有任何错误,你会发现成功在远程计算机上创建了一个txt文本。

 

posted @ 2020-07-31 15:57  strive-sun  阅读(355)  评论(0编辑  收藏  举报