Как правильно вызвать «telnet» с функцией CreateProcess? - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу запустить «telnet» через cmd.exe и записать результат выполнения этой команды в файл.Когда я запускаю команду «ipconfig», я получаю всю необходимую информацию, но после выполнения команды «telnet» я получаю просто пустой файл.

Вот мой код:

#include "windows.h"
#include "iostream"

void SaveResult(const wchar_t *fileName, const wchar_t *commandLine)
{
    SECURITY_ATTRIBUTES sa;
    sa.nLength = sizeof(sa);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;

    HANDLE h = CreateFile(fileName, FILE_WRITE_DATA, FILE_SHARE_WRITE | FILE_SHARE_READ,
        &sa, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (h == INVALID_HANDLE_VALUE)
        return;

    PROCESS_INFORMATION pi = { 0 };
    STARTUPINFO si = { sizeof(si) };
    si.dwFlags |= STARTF_USESTDHANDLES;
    si.hStdInput = NULL;
    si.hStdError = h;
    si.hStdOutput = h;

    wchar_t *writable_cmdline = _wcsdup(commandLine);
    BOOL success = CreateProcess(NULL, writable_cmdline,
        NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);

    bool finished = false;

    //wait for 1 second
    for (int i = 0; i < 10; i++)
    {
        if (WaitForSingleObject(pi.hProcess, 100) <= 0)
        {
            finished = true;
            break;
        }
    }

    if (success)
    {
        CloseHandle(pi.hProcess);
        CloseHandle(pi.hThread);
    }

    CloseHandle(h);
    free(writable_cmdline);

    if (!finished)
        printf("Process didn't finish\n");
}


int main()
{
    SaveResult(L"telnet.txt", L"C:\\windows\\system32\\cmd.exe /c telnet test.com");
    SaveResult(L"ipconfig.txt", L"C:\\windows\\system32\\cmd.exe /c ipconfig");
    return 0;
}

1 Ответ

0 голосов
/ 05 декабря 2018

Вы запускаете команду telnet непосредственно в консоли cmd?Есть ли что-нибудь на выходе?Если это так, пустой файл может, потому что буфер не был обновлен в файл.Как заметил @ David, вы просто ждете 1 с, но если для подключения будет более 1 с, то вы закроете обработчик без обновления буфера.Попробуйте добавить FlushFileBuffers(h) перед CloseHandle(h).Для WaitForSingleObject вы можете попробовать WaitForSingleObject(pi.hProcess, INFINITE), дождитесь завершения процесса telnet.

...