思路:获取所有使用的盘符,从26个字母中剔除这些使用的,剩下未使用的,可以进行挂载。
std::string TCHAR2STRING(TCHAR * STR)
int iLen = WideCharToMultiByte(CP_ACP, 0, STR, -1, NULL, 0, NULL, NULL);
char* chRtn = new char[iLen * sizeof(char)];
WideCharToMultiByte(CP_ACP, 0, STR, -1, chRtn, iLen, NULL, NULL);
std::string str(chRtn);
return str;
void getDrive(vector<string>& vsUse)
DWORD dwDriveStrLen;
TCHAR wDrivesName[0x100];
dwDriveStrLen = sizeof(wDrivesName);
GetLogicalDriveStrings(dwDriveStrLen, wDrivesName);
TCHAR *p = (TCHAR *)wDrivesName;
while (*p)
string strDrivePath = TCHAR2STRING(p);
transform(strTmp.begin(), strTmp.end(), strTmp.begin(), tolower);
vsUse.push_back(strDrivePath.substr(0,1));
char* pRet = TCHAR2char(p);
p += (_tcslen(TCHAR2char(p)) + 1);
delete[] pRet;
net use 盘符: \\服务器名\共享文件名 /user:用户名 "密码"
net use q: \\127.0.0.1\new /user:admin 12345
但是上述命令挂载成功后重启电脑需要手动再输入密码,不能记住密码,记住密码需要使用/SAVECRED /PERSISTENT:YES,但该字段与user字段不能同时使用,如果想既输入密码又记住密码,需要先建立一个windows凭据,然后使用/SAVECRED /PERSISTENT:YES字段,这样会使用已有的凭据来进行网络映射。
net use 盘符: \\服务器名\共享文件名 /SAVECRED /PERSISTENT:YES
net use q: \\127.0.0.1\new /SAVECRED /PERSISTENT:YES
建立windows凭据的命令为:
cmdkey /add:服务器名 /user:用户名 /pass:密码
cmdkey /add:127.0.0.1 /user:admin /pass:12345
使用时,先添加凭据,再输入net use记住密码的挂载命令。
执行挂载命令时,如果使用管理员权限,即便执行命令成功,计算机那里不会显示相应的盘,需要使用普通权限来运行cmd命令。
如果是程序中,程序是管理员权限运行,那么就需要降权来执行挂载的命令。
具体降权的做法是:获取Shell的桌面窗口的句柄,拿到Explorer的token,复制这个token,然后用这个token执行cmd命令,即目的是使用Explorer等级的权限(普通权限)来运行命令。
int excuteExplorerLevel(char* CommandLine)
int iRet = 1;
SECURITY_ATTRIBUTES sa;
HANDLE hRead, hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead, &hWrite, &sa, 0))
return FALSE;
STARTUPINFOW si;
PROCESS_INFORMATION pi;
SecureZeroMemory(&si, sizeof(si));
SecureZeroMemory(&pi, sizeof(pi));
si.cb = sizeof(si);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
HANDLE hShellProcess = nullptr, hShellProcessToken = nullptr,
hPrimaryToken = nullptr;
HWND hwnd = nullptr;
DWORD dwPID = 0;
HRESULT hr = S_OK;
BOOL ret = TRUE;
DWORD dwLastErr;
hwnd = GetShellWindow();
if (nullptr == hwnd) {
::CloseHandle(hWrite);
::CloseHandle(hRead);
return 0;
GetWindowThreadProcessId(hwnd, &dwPID);
if (0 == dwPID) {
::CloseHandle(hWrite);
::CloseHandle(hRead);
return 0;
hShellProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwPID);
if (!hShellProcess)
dwLastErr = GetLastError();
return 0;
bool retval = false;
ret = OpenProcessToken(hShellProcess, TOKEN_DUPLICATE, &hShellProcessToken);
if (!ret) {
dwLastErr = GetLastError();
CloseHandle(hShellProcessToken);
CloseHandle(hPrimaryToken);
CloseHandle(hShellProcess);
::CloseHandle(hWrite);
::CloseHandle(hRead);
return 0;
const DWORD dwTokenRights = TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY |
TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT |
TOKEN_ADJUST_SESSIONID;
ret = DuplicateTokenEx(hShellProcessToken, dwTokenRights, nullptr,
SecurityImpersonation, TokenPrimary, &hPrimaryToken);
if (!ret) {
dwLastErr = GetLastError();
CloseHandle(hShellProcessToken);
CloseHandle(hPrimaryToken);
CloseHandle(hShellProcess);
::CloseHandle(hWrite);
::CloseHandle(hRead);
return 0;
int dwLen = strlen(CommandLine) + 1;
int nwLen = MultiByteToWideChar(CP_ACP, 0, CommandLine, dwLen, NULL, 0);
LPWSTR lpszPath = new WCHAR[dwLen];
MultiByteToWideChar(CP_ACP, 0, CommandLine, dwLen, lpszPath, nwLen);
ret = CreateProcessWithTokenW(hPrimaryToken, 0, nullptr, lpszPath, 0, nullptr,
nullptr, &si, &pi);
if (!ret) {
dwLastErr = GetLastError();
CloseHandle(hShellProcessToken);
CloseHandle(hPrimaryToken);
CloseHandle(hShellProcess);
::CloseHandle(hWrite);
::CloseHandle(hRead);
return 0;
::WaitForSingleObject(pi.hThread, INFINITE);
::WaitForSingleObject(pi.hProcess, INFINITE);
DWORD dwFileSize = GetFileSize(hRead, NULL);
char *buffer = new char[dwFileSize + 1];
DWORD dwReadSize;
::ReadFile(hRead, buffer, dwFileSize, &dwReadSize, NULL);
if (strstr(buffer, _T("错误")) != nullptr)
if (strstr(buffer, _T("85")) != nullptr)
iRet = 85;
else if (strstr(buffer, _T("1219")) != nullptr)
iRet = 1219;
iRet = 0;
delete[] buffer;
if (pi.hThread != nullptr)
::CloseHandle(pi.hThread);
if (pi.hProcess != nullptr)
::CloseHandle(pi.hProcess);
::CloseHandle(hWrite);
::CloseHandle(hRead);
CloseHandle(hShellProcessToken);
CloseHandle(hPrimaryToken);
CloseHandle(hShellProcess);
return iRet;
- win10上管理员和非管理员执行命令后,不能及时显示已挂载的网盘,是UAC机制导致,修改注册表可能有用,修改完需要重启电脑。
注册表位置:Software\Microsoft\Windows\CurrentVersion\Policies\System\
新建EnableLinkedConnections,REG_DWORD值为1。
@echo offset filename=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%set filename="DataBak-%filename%"net use z: \\172.18.3.5\moudle password /user:usernamemd Z:\3-43-bak\%filename%xcopy C:\Data\DataBak\*.* Z...
Windows operating systems provide the net use command in order to connect ,remove, configure connections to the shared resources like mapped drives, network resources and network printers. net use com...
使用net use 命令可以将远端的共享资源挂载到本地,即将共享目录映射到本地的指定位置。
假设现在存在两台机器,一台ip为10.13.0.99作为目标机器,一台ip为10.13.6.139作为本地机器,现在我想在本地机器(10.13.6.139)上将目标机器(10.13.0.99)的c盘映射为本地的z盘,则只需输入命令
net use z: \\10.13.0.99\c$ password /user:username
成功挂载之后就可以在我的电脑处看到挂载的c盘内容
当想要共享某
【原文写于6 January 2006,注】 Net use 命令使用zz from http://www.lre.cn/article/read.asp?id=761Net use将计算机连接到某个共享资源或与其断开连接,或者显示有关计算机连接的信息。该命令还控制永久性网络连接。在没有参数的情况下使用,net use 可以检索网络连接列表。 语法net use [{D
net use \\ip地址 /user:用户名 #指定局域网中某个电脑的访问用户名,如有密码会继续提示输入(密码可能不显示)。
net use \\ip地址 "密码" /user:用户名 #直接输入密码型
net use #查看已连接的用户列表
net use * delete #删除已有连接,避免出现“一个用户使用多重连接”的问题。
net time \\ip地址 #查看指定电脑的时间
net use #查看本地主机的用户列表
net share .
fuser可以显示出当前哪个程序在使用磁盘上的某个文件、挂载点、甚至网络端口,并给出程序进程的详细信息。
fuser显示使用指定文件或者文件系统的进程ID。
默认情况下每个文件名后面跟一个字母表示访问类型。
在zkfc的日志里面,有一个warn:PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 8090 via ssh: bash: fuser: 未找到命令
原因是最小化安装centos的时候,没有fuser这个命令
yum install -y psmisc
fuser(选项)(参数)
访问类型如下:
c:代表当前目录
net use 是实现驱动器映射的命令行工具。
例子1. net use n: \\192.168.1.2\share
n:代表虚拟的驱动器盘符,显示在我的电脑中,它映射到192.168.1.2这台电脑上的share文件夹。以后双击进入n:盘,实际进入的就是192.168.1.2这台电脑上的share文件夹。
运行上述命令时,会提示输入用户名和密码,注意,输入密码时不会显示输入的密码
参考博客:QT开发(八)—— Network网络操作,本地HOST,GET请求_刘桂林的博客-CSDN博客_qtnetwork
Qt:60---网络编程之HTTP通信(QNetworkRequest、QNetworkReply、NetworkAccessManager)_董哥的黑板报-CSDN博客
Qt学习笔记一:Qt使用network模块进行http请求时获取response中的http状态码_chexiaohui6306的博客-CSDN博客
一、开始进行使用网络通信的时候,需要在qt的pro中加.