第一步,在一台计算机上将某个驱动器或者某个文件夹设为sharing模式。这是我们需要访问的共享文件夹。(不需要设置everyone权限)
第二步,我们需要为两台在同一domain下的计算机上建立连接。
使用 Net use 指令,我们可以在代码中添加该指令,具体参数请见文档。 或者我们从cmd中快捷创建。
C:WINDOWSsystem32>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 "; CloseHandle(h); } else { std::cerr << "CreateFile() failed:" << GetLastError() << " "; } RevertToSelf(); return 0; }
如果上面没有任何错误,你会发现成功在远程计算机上创建了一个txt文本。