windows/Linux c++ 获取CMD指令执行的返回结果
无论是在windows还是linux下我们都可以借助popen执行终端指令并获取到返回值。
/// 执行cmd指令并返回结果
string getCmdResult(const string &strCmd)
{char buf[10240] = {0};FILE *pf = NULL;if( (pf = popen(strCmd.c_str(), "r")) == NULL ){return "";}string strResult;while(fgets(buf, sizeof buf, pf)){strResult += buf;}pclose(pf);unsigned int iSize = strResult.size();if(iSize > 0 && strResult[iSize - 1] == '\n') // linux{strResult = strResult.substr(0, iSize - 1);}return strResult;
}
但是值得注意的是,windows下诸多的指令需要管理员的权限才能执行,这是很令人头疼的。
除了上述方法外,我们先大致罗列下windows下可以执行命令行指令的方法:
1、WinExec() ==》无法直接使用管理员权限,无法获取返回信息,只能判断是否执行
QString cmdstr = QString("cmd /c taskkill /im iphelper.exe /t /f");WinExec(cmdstr.toLatin1().data(), SW_HIDE);
2、ShellExecute()==》可使用管理员权限,无法获取返回信息
ShellExecute(0,"runas", LPCSTR("cmd.exe"),LPCSTR("/c net user administrator /active:yes"),"",SW_HIDE);
3、CreateProcessAsUser()==》可使用管理员权限,无法获取返回信息,可判断是否执行成功
BOOL CreateProcessAsUser(HANDLE hToken, // handle to a token representing the logged-on userLPCTSTR lpApplicationName, // pointer to name of executable moduleLPTSTR lpCommandLine, // pointer to command line stringLPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributesLPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributesBOOL bInheritHandles, // whether new process inherits handlesDWORD dwCreationFlags, // creation flagsLPVOID lpEnvironment, // pointer to new environment blockLPCTSTR lpCurrentDirectory, // pointer to current directory nameLPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFOLPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
);
4、CreateProcessW() ==》 可使用管理员权限,无法直接获取返回信息,可判断是否执行成功。
附一个封装的基于CreateProcessW 的方法,支持阻塞模式。
bool RunProgram(QString exePath, QString args, bool bWaitFor)
{STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);ZeroMemory(&pi, sizeof(pi));exePath = exePath + " " + args;if (!CreateProcessW(nullptr, // No module name (use command line)const_cast<LPWSTR>(exePath.toStdWString().c_str()), // Command lineNULL, // Process handle not inheritableNULL, // Thread handle not inheritableFALSE, // Set handle inheritance to FALSECREATE_NO_WINDOW, // No creation flagsNULL, // Use parent's environment blockNULL, // Use parent's starting directory&si, // Pointer to STARTUPINFO structure&pi) // Pointer to PROCESS_INFORMATION structure){printf("CreateProcess failed (%d).\n", GetLastError());return false;}if (bWaitFor){WaitForSingleObject(pi.hProcess, INFINITE);//Close process and thread handles.CloseHandle(pi.hProcess);CloseHandle(pi.hThread);}return true;
}
显然,在我们渴望获取到指令返回的信息时,以上的几种方法都不如人意。考虑到‘runas’方法,那么我们能否既使用管理员权限执行指令的同时获取到指令执行返回结果信息呢?答案是肯定的。
先熟悉下windows的runas指令:
RUNAS 用法:RUNAS [ [/noprofile | /profile] [/env] [/savecred | /netonly] ]/user:<UserName> programRUNAS [ [/noprofile | /profile] [/env] [/savecred] ]/smartcard [/user:<UserName>] programRUNAS /trustlevel:<TrustLevel> program/noprofile 指定不应该加载用户的配置文件。这会加速应用程序加载,但可能会造成一些应用程序运行不正常。/profile 指定应该加载用户的配置文件。这是默认值。/env 要使用当前环境,而不是用户的环境。/netonly 只在指定的凭据限于远程访问的情况下才使用。/savecred 用用户以前保存的凭据。/smartcard 如果凭据是智能卡提供的,则使用这个选项。/user <UserName> 应使用 USER@DOMAIN 或 DOMAIN\USER 形式/showtrustlevels 显示可以用作 /trustlevel 的参数的信任级别。/trustlevel <Level> 应该是在 /showtrustlevels 中枚举的一个级别。program EXE 的命令行。请参阅下面的例子示例:
> runas /noprofile /user:mymachine\administrator cmd
> runas /profile /env /user:mydomain\admin "mmc %windir%\system32\dsa.msc"
> runas /env /user:user@domain.microsoft.com "notepad \"my file.txt\""注意: 只在得到提示时才输入用户的密码。
注意: /profile 跟 /netonly 不兼容。
注意: /savecred 跟 /smartcard 不兼容。
那么方法就有了,只需要在使用getCmdResult()函数时,我们在传参strCmd中借用runas指定程序使用管理员权限执行即可。
string cmd = string("runas /noprofile /user:mymachine\\administrator \"cmd /c ") + "cmd /c chcp 65001 && ping www.baidu.com -n 1 -w 1000" + "\"";strRe = getCmdResult(cmd);cout << strRe << endl;
完整的测试代码如下:
#include <iostream>#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>using namespace std;/// 执行cmd指令并返回结果
string getCmdResult(const string &strCmd)
{char buf[10240] = {0};FILE *pf = NULL;if( (pf = popen(strCmd.c_str(), "r")) == NULL ){return "";}string strResult;while(fgets(buf, sizeof buf, pf)){strResult += buf;}pclose(pf);unsigned int iSize = strResult.size();if(iSize > 0 && strResult[iSize - 1] == '\n') // linux{strResult = strResult.substr(0, iSize - 1);}return strResult;
}int main(int argc, char *argv[])
{/// 获取ping指令的结果string strCmd = "cmd /c chcp 65001 && ping www.baidu.com -n 1 -w 1000";string strRe = getCmdResult(strCmd);cout << strRe << endl;/// 以管理员的身份运行程序并返回结果/// runasstring cmd = string("runas /noprofile /user:mymachine\\administrator \"cmd /c ") + "cmd /c chcp 65001 && ping www.baidu.com -n 1 -w 1000" + "\"";strRe = getCmdResult(cmd);cout << strRe << endl;return 0;
}
windows/Linux c++ 获取CMD指令执行的返回结果相关推荐
- Windows/Linux下获取当前线程的ID号
序 在多线程场合,为了方便跟踪线程的运行状态,往往需要在程序中添加打印当前线程ID号的功能. 1. Linux下打印当前线程ID pthread_t pthread_self() 2. Windows ...
- Windows下好玩的CMD指令-----开机后自动关机
首先打开一个记事本,输入以下内容后,保存文件,然后后缀名改为.bat @ color 4f @echo off echo 这是一个文本文件,要删除你的资料哦 ping -n 2 127.1>nu ...
- linux shell 获取当前正在执行脚本的绝对路径
常见的一种误区,是使用 pwd 命令,该命令的作用是"print name of current/working directory",这才是此命令的真实含义,当前的工作目录,这里 ...
- linux shell获取当前执行路径
linux shell 获取当前正在执行脚本的绝对路径 basepath=$(cd `dirname $0`; pwd) project_path=$(cd `dirname $0`; pwd) pr ...
- Java调用linux指令工具类,直接执行cmd,执行grep指令返回结果,执行sed追加指令,hdfs下载指令,获取文件行数
Java调用linux指令工具类,直接执行cmd,执行grep指令返回结果,执行sed追加指令,hdfs下载指令,获取文件行数 问题背景 LinuxUtils工具类 Lyric:梦想挟带眼泪 问题背景 ...
- C/C++:Windows cmd 指令
一.快捷键 1. Windows键 自从104键盘首次加入Windows键后,微软便一直计划为这个键添加更多功能,当然Win8也不例外. * Win+C:调出应用Charm菜单(Metro.传统桌面) ...
- Windows/Linux获取Mac地址和CPU序列号实现
UUID(Universally Unique Identifier)即通用唯一标识符,是指在一台机器上生成的数字,保证在全球范围的唯一性.可用的开源库如libuuid,可参考https://blog ...
- cmd指令大全指令_干货 | Linux 超全实用指令大全
运行级别和找回root密码 指定运行级别 运行级别说明: 0:关机 1:单用户[找回丢失密码] 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重 ...
- Windows下常用的100个CMD指令以及常见的操作
为什么80%的码农都做不了架构师?>>> Windows下常用的100个CMD指令以及常见的操作 常用的100个CMD指令 gpedit.msc-–组策略 2. sndrec3 ...
最新文章
- thinkphp6 接收不到数据_单片机红外接收与红外发射
- list、dict、tuple的一些小操作总结
- 2.1.5 梯度检验
- 学用MVC4做网站二:2.2添加用户组
- Popupwindowdemo
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1051:分段函数
- Python+Opencv识别两张相似图片
- scrapy爬虫框架windows下的安装问题
- 工作312:uni-时间戳处理
- bootstrap在iframe框架中实现由子页面在顶级页面打开模态框(modal)
- python3字典写入excel_Python玩转Excel(第2期)~这里只有干货
- 数据库连接池的作用及c3p0的详解(转载他人的--合理掌握学习方式)
- 常用类 (七) ----- 包装类
- PHP环境 PDOException PDOException: could not find driver
- [android]亲自破解Flappy Bird(去广告+永生)
- UVA 10341 Solve It
- 目标检测网络 -- FasterRCNN
- smbd服务器-网络磁盘映射
- 《华盛顿邮报》评选的完整电影清单(包括上映时期和豆瓣评分)
- SETCLIENTID