远程CMD基础
来源:互联网 发布:马修博尔顿瓦特知乎 编辑:程序博客网 时间:2024/06/06 19:06
远程CMD的过程,就是服务器发送命令,客户端执行,客户端把命令交给CMD执行, CMD把执行之后的返回数据交给客户端,客户端返回。其中,CMD与客户端的交互,需要用到管道。此处有例子一个。贴在这里。
// cmdTest.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <afx.h>#include <Windows.h>#include <atlbase.h>#include <string>using namespace std;BOOL CreateCMD(HANDLE &hReadPipe1,HANDLE &hWritePipe1,//匿名管道1读写句柄 HANDLE &hReadPipe2,HANDLE &hWritePipe2,//匿名管道2读写句柄 HANDLE &hProcess)//创建的CMD.EXE进程句柄{BOOL ret;SECURITY_ATTRIBUTES sa;sa.nLength=sizeof(sa);sa.lpSecurityDescriptor=0;sa.bInheritHandle=TRUE;ret=CreatePipe(&hReadPipe1,&hWritePipe1,&sa,0);if (!ret) {return FALSE;}ret=CreatePipe(&hReadPipe2,&hWritePipe2,&sa,0);if (!ret) {return FALSE;}STARTUPINFO si;ZeroMemory(&si,sizeof(si));si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;si.wShowWindow = SW_HIDE;si.lpDesktop = "WinSta0\\Default";//创建进程且重定向标准输入输出//将其标准输入设置为hReadPipe2si.hStdInput = hReadPipe2;//将其标准输出和错误输出设置为hWritePipe1si.hStdOutput = si.hStdError = hWritePipe1;char cmdLine[] = "cmd.exe /k";PROCESS_INFORMATION pi;ret=CreateProcess(NULL,cmdLine,NULL,NULL,1,0,NULL,NULL,&si,&pi);if (!ret) {return FALSE;}hProcess=pi.hProcess;CloseHandle(pi.hThread);return TRUE;}//****************************************************************************//此函数用来写已建立的管道BOOL WriteCMD(CString cmdBuffer,HANDLE hWritePipe2){DWORD lBytesWrite;cmdBuffer+="\r\n";if (!WriteFile(hWritePipe2,(LPTSTR)(LPCTSTR)cmdBuffer,cmdBuffer.GetLength(),&lBytesWrite,NULL)) {return FALSE;}return TRUE;}//****************************************************************************//此函数用来读已建立的管道BOOL ReadCMD(HANDLE hReadPipe1,CString &cmdResult){BOOL ret;DWORD lBytesRead;char *buffer=new char [1024];while(true){memset(buffer,0,1024);ret=ReadFile(hReadPipe1,buffer,1023,&lBytesRead,0);if (!ret){delete [] buffer;return FALSE;}buffer[lBytesRead]='\0';cmdResult += buffer;if(buffer[lBytesRead-1]=='>') {delete [] buffer;return TRUE;}}delete buffer;return TRUE;}//*****************************************************************************//此函数用来关闭管道void CloseCMD(HANDLE hReadPipe1,HANDLE hWritePipe1,//匿名管道1读写句柄 HANDLE hReadPipe2,HANDLE hWritePipe2,//匿名管道2读写句柄 HANDLE hProcess)//创建的CMD.EXE进程句柄{CloseHandle(hReadPipe1);CloseHandle(hWritePipe1);CloseHandle(hWritePipe2);CloseHandle(hReadPipe2);TerminateProcess(hProcess,0);}//*****************************************************************************//此函数用来清空管道数据void EmptyPipe(HANDLE hReadPipe1){BOOL ret;DWORD bytesRead;char *buffer=new char [1024];while(true){memset(buffer,0,1024);ret=PeekNamedPipe(hReadPipe1,buffer,1024,&bytesRead,0,0);if (bytesRead==0||!ret) {delete [] buffer;return;}ReadFile(hReadPipe1,buffer,bytesRead,&bytesRead,0);}}int _tmain(int argc, _TCHAR* argv[]){HANDLE hRead1,hWrite1; //读句柄,写句柄HANDLE hRead2,hWrite2; //读句柄,写句柄HANDLE hCmd;CString result;DWORD dw;if (CreateCMD(hRead1,hWrite1,hRead2,hWrite2,hCmd) < 0){printf("CreateCMD 失败 ");dw = GetLastError();printf("GetLastError-->%u\n", dw);ExitProcess(dw);return -1;}if (ReadCMD(hRead1,result) < 0){printf("ReadCMD 失败 ");dw = GetLastError();printf("GetLastError-->%u\n", dw);ExitProcess(dw);return -1;}printf("%s",result);result.Empty();char szBuf[MAX_PATH];while (true){ZeroMemory(szBuf,MAX_PATH);gets(szBuf);if (WriteCMD(szBuf,hWrite2) < 0){printf("WriteCMD 失败 ");dw = GetLastError();printf("GetLastError-->%u\n", dw);ExitProcess(dw);return -1;}if (ReadCMD(hRead1,result) < 0){printf("ReadCMD 失败 ");dw = GetLastError();printf("GetLastError-->%u\n", dw);ExitProcess(dw);return -1;} int i= result.Find("\r\n");result = result.Mid(i+2); printf("%s",result); result.Empty(); }CloseCMD(hRead1,hWrite1,hRead2,hWrite2,hCmd);system("pause");return 0;}
- 远程CMD基础
- cmd远程Oracle数据
- cmd连接远程mysql
- cmd连接远程mysql
- C++ 远程 shell (cmd)
- cmd中启动远程数据库
- 使用cmd远程连接mysql
- cmd 远程连接Oracle数据库
- cmd命令基础常识
- firewall-cmd 基础使用
- 利用匿名管道实现远程CMD
- 远程执行CMD命令部分代码
- 远程执行CMD命令部分代码
- 利用匿名管道实现远程CMD
- 远程执行CMD命令部分代码
- 利用匿名管道实现远程CMD(转)
- cmd命令行访问远程mysql数据库
- 利用匿名管道实现远程CMD(转)
- 如何在excel的一行或一列内容前面加个0
- POJ1159 dp入门
- javascript 循环读取JSON数据的代码(获取key value)
- free之后的NULL和非NULL
- 用加减来简单的看策略类
- 远程CMD基础
- sort和qsort排序
- 自适应流媒体技术 简介
- linux-2.6.32在mini2440开发板上移植(18)之移植PWM蜂鸣器驱动
- jsp的内置对象和常见问题
- 第五周项目1 设计三角形类
- Uva 11552 Fewest Flops (三维动态规划)
- 签约谷歌美国--个人经历
- JavaScript中去掉数组中的重复值的实现方法