捕获远程进程子进程的标准输出

Capture stdout for a remote process' child process

本文关键字:子进程 标准输出 进程 程进程      更新时间:2023-10-16

目前正在处理我需要捕获外部进程的子进程的stdout/stdrr的情况。对于这种情况,我是否需要命名管道?

我目前已尝试以下方法:

SECURITY_ATTRIBUTES saAttr;
HANDLE hStdOutRd = NULL;
HANDLE hStdOutWr = NULL;
HANDLE hDupStdOutWr = NULL;
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
saAttr.bInheritHandle = TRUE; 
saAttr.lpSecurityDescriptor = NULL; 
CreatePipe(&hStdOutRd, &hStdOutWr, &saAttr, 0) ) 
SetHandleInformation(hStdOutRd, HANDLE_FLAG_INHERIT, 0) )
HANDLE hExProc = OpenProcess(PROCESS_DUP_HANDLE, false, EXTERNAL_PROC);
DuplicateHandle(GetCurrentProcess(), 
                hStdOutWr, 
                hExProc,
                &hDupStdOutWr, 
                0,
                TRUE,
                DUPLICATE_SAME_ACCESS);
// Child process for EXTERNAL_PROC executes and should inherit the duplicated handle
// Read from hStdOutRd

从管道读取时,它要么挂起,要么不返回任何内容。我假设这是一个匿名管道,仅适用于父子进程,不适用于外部进程。我宁愿不使用命名管道,是否可以将管道从远程进程返回到我的进程,然后访问数据?如果是这样,那会是什么样子?

不,您不需要使用命名管道,匿名管道可以正常工作。MSDN 提供了从子进程捕获输出的完整示例:

创建具有重定向输入和输出的子进程