【发布时间】:2021-03-31 09:48:54
【问题描述】:
使用 CreateProcess 创建一个运行 sfc.exe 的进程。但是,没有效果。 我有管理员权限来运行这个程序
我使用 CreateProcess API 来控制 CUI 输出并捕获 CUI 程序输出信息。
我想使用管道接收 sfc /scannow 命令输出,并且
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
HANDLE hReadPipe = NULL;
HANDLE hWirtePipe = NULL;
if (!CreatePipe(&hReadPipe, &hWirtePipe, &sa, NULL)) {
std::cout << "create pipe failed \n";
return -1;
}
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES,
si.wShowWindow = SW_HIDE;
si.hStdError = hWirtePipe;
si.hStdOutput = hWirtePipe;
TCHAR szCommand[] = TEXT("sfc /scannow");
if (!CreateProcess(NULL, szCommand, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
{
cout << "process create failed ,errno is :"<< GetLastError() << endl;
CloseHandle(hReadPipe);
CloseHandle(hWirtePipe);
return -1;
}
DWORD dwRead = 0;
DWORD stdRead = 0;
DWORD total;
DWORD timeout = 50;
TCHAR bufferOutPipe[1024] = {0};
TCHAR readBuffer[1024] = {0};
BOOL flag = true;
while (flag) {
if (WAIT_TIMEOUT == WaitForSingleObject(pi.hProcess, timeout)) {
if (!PeekNamedPipe(hReadPipe, bufferOutPipe, 1024, &dwRead, &total, 0) || dwRead <= 0) {
continue;
}
else {
ReadFile(hReadPipe, readBuffer, dwRead, &stdRead, NULL);
printf("%s\n", readBuffer);
dwRead = 0;
}
}
else if (WAIT_OBJECT_0 == WaitForSingleObject(pi.hProcess, timeout)) {
if (PeekNamedPipe(hReadPipe, bufferOutPipe, 1024, &dwRead, &total, 0) && dwRead > 0) {
ReadFile(hReadPipe, readBuffer, dwRead, &stdRead, NULL);
printf("%s\n", readBuffer);
}
flag = false;
}
ZeroMemory(readBuffer, 1024);
}
CloseHandle(hReadPipe);
CloseHandle(hWirtePipe);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
我想接收'SFC / scannow'命令的输出并使用匿名管道和进程重定向输出,但我听不到任何管道数据,创建的进程立即启动,
我和管理员一起开始了 Visual Studio
【问题讨论】:
-
您能发布一些以
sfc.exe开头的代码吗?它是否适用于其他程序,例如calc.exe? -
是的,有些工具可以通过 CreateProcess 启动,例如:Dism.exe
-
这是什么编程语言? C++?为语言添加标签将提高您的问题的可见性,并可能导致更有用的答案。
-
我通过删除
CREATE_NEW_CONSOLE标志让您的示例正常工作。 (Ofc,您的 sn-p 中缺少一些元素,例如processInfo的声明)。最后你还需要调用CloseHandle(processInfo.hProcess)和CloseHandle(processInfo.hThread)。 -
是的,你说的没错,但是我要指出的是,CreateProcess创建的进程无法得到SFC的输出。奇怪的是,我使用 dism /?现在不是SFC/scan,而是有输出信息
标签: c++ windows visual-c++