C/C++

C++ 匿名管道执行DOS命令

Image

最近在开发一个项目。需要PHP Sock连接到服务器中执行DOS 命令 , 所以想到了命名管道 CreatePipe 其函数原型

BOOL CreatePipe(
  PHANDLE hReadPipe,                       // 指定一个变量,设为管道读入(输出)端的一个句柄 
  PHANDLE hWritePipe,                      // 指定一个变量,设为管道写入(输入)端的一个句柄 
  LPSECURITY_ATTRIBUTES lpPipeAttributes,  // 安全属性
  DWORD nSize                              // 管道尺寸
);

该CreatePipe函数创建一个匿名管道,并返回句柄的读取和写入管道的末端。

SECURITY_ATTRIBUTES sa;
	HANDLE hRead,hWrite;
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.lpSecurityDescriptor = NULL;
	sa.bInheritHandle = TRUE;

	string str= "cmd /k net user";  //命令行

	if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
		//MessageBox("Error On CreatePipe()");
		return FALSE;
	}
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	si.cb = sizeof(STARTUPINFO);
	GetStartupInfo(&si);
	si.hStdError = hWrite;//数据输出用的文件句柄
	si.hStdOutput = hWrite;//数据输出用的文件句柄
	si.wShowWindow = SW_HIDE;
	si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;

	OutputDebugString("1");

	if (!CreateProcess(NULL,(char*)str.c_str()//执行cmd命令,并在命名中管道中写入cmd命令返回的串
		,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) {
		//MessageBox("Error on CreateProcess()");
		return FALSE;
	}
	CloseHandle(hWrite);
	//OutputDebugString("2");

	char buffer[4096] ={0} ;
	DWORD bytesRead;
	string strResult="";

	while(1)
	{
		memset(buffer,0,4096);
		if(ReadFile(hRead,buffer,4096,&bytesRead,NULL) != NULL)//从命名管道中读取数据
		{
			strResult += buffer;
			cout << strResult;
			OutputDebugString(buffer);

		}
		else
		{
			break;
		}
	}
	CloseHandle(hRead);

0 条评论

发表评论

你需要登录后才可进行发表