Запустите CMD.EXE с CreateProcessWithLogonW () без новой консоли - PullRequest
0 голосов
/ 06 апреля 2020

Я должен запустить cmd.exe с CreateProcessWithLogonW(), но в контексте моей программы без создания другой консоли, но MSDN говорит, что флаг CREATE_NEW_CONSOLE установлен по умолчанию. Как я могу снять этот флаг, чтобы этот API не создавал новое окно для моего дочернего процесса?

Следующий код показывает, как этот API используется в моей программе. Я не хочу, чтобы новая программа запускалась в новой консоли, но я не смог найти решение для этого.

BOOL status = FALSE;
DWORD process_flags = 0 | arg_process_flags;
DWORD logon_flags = 0 | arg_logon_flags;
PTSTR duplicate_command_Line;
PPROCESS_INFORMATION ptr_process_info;
STARTUPINFO startup_info;
RtlZeroMemory(&startup_info, sizeof(STARTUPINFO));
startup_info.cb = sizeof(STARTUPINFO);

if (ptr_process_info = arg_process_infos ? arg_process_infos : (PPROCESS_INFORMATION)LocalAlloc(LPTR, sizeof(PROCESS_INFORMATION)))
{
    if (duplicate_command_Line = _wcsdup(arg_command_Line))
    {
        switch (arg_type)
        {
            case KULL_M_PROCESS_CREATE_NORMAL:
                status = CreateProcess(NULL, duplicate_command_Line, NULL, NULL, FALSE, process_flags, NULL, NULL, &startup_info, ptr_process_info);
                break;

            case KULL_M_PROCESS_CREATE_USER:
                status = CreateProcessAsUser(arg_user_token, NULL, duplicate_command_Line, NULL, NULL, FALSE, process_flags, NULL, NULL, &startup_info, ptr_process_info);
                break;

            case KULL_M_PROCESS_CREATE_LOGON:
                status = CreateProcessWithLogonW(arg_user, arg_domain, arg_password, logon_flags, NULL, duplicate_command_Line, process_flags, NULL, NULL, &startup_info, ptr_process_info);
                break;
        }

        if (status && (arg_auto_close_handle || !arg_process_infos))
        {
            CloseHandle(ptr_process_info->hThread);
            CloseHandle(ptr_process_info->hProcess);
        }

        if (!arg_process_infos)
            LocalFree(ptr_process_info);

        free(duplicate_command_Line);
    }
}

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

Вы можете перенаправить ввод и вывод дочернего процесса

Вот моя тестовая программа (удалите проверку ошибок).

Родитель:

#include <windows.h>
#include <iostream>
#define BUFSIZE 4096 
void main()
{
    printf("in Parent \n");
    HANDLE R_In, R_Out, R_err, W_In, W_Out, W_err;
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
    SECURITY_ATTRIBUTES saAttr;
    BOOL bSuccess;
    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
    saAttr.bInheritHandle = TRUE;
    saAttr.lpSecurityDescriptor = NULL;

    CreatePipe(&R_In, &W_In, &saAttr, 0);
    CreatePipe(&R_Out, &W_Out, &saAttr, 0);
    CreatePipe(&R_err, &W_err, &saAttr, 0);
    PROCESS_INFORMATION process_info;
    STARTUPINFO startup_info;
    RtlZeroMemory(&startup_info, sizeof(STARTUPINFO));
    startup_info.cb = sizeof(STARTUPINFO);
    startup_info.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    startup_info.wShowWindow = SW_HIDE;
    startup_info.hStdInput = R_In;
    startup_info.hStdOutput = W_Out;
    startup_info.hStdError = W_err;

    BOOL ret = CreateProcessWithLogonW(L"username",L"domain",L"password", 0,L"ChildProcess.exe",NULL, CREATE_NO_WINDOW,NULL,NULL,&startup_info,&process_info);
    CloseHandle(R_In);
    CloseHandle(W_Out);
    CloseHandle(W_err);
    CHAR chBuf[BUFSIZE];
    DWORD dwRead, dwWritten;
    bSuccess = ReadFile(hStdin, chBuf, BUFSIZE, &dwRead, NULL);
    bSuccess = WriteFile(W_In, chBuf, dwRead, &dwWritten, NULL);
    while (1)
    {
        bSuccess = ReadFile(R_Out, chBuf, BUFSIZE, &dwRead, NULL);
        if (bSuccess == 0 & GetLastError() == ERROR_BROKEN_PIPE) // child process exit.
            break;
        bSuccess = WriteFile(hStdout, chBuf, dwRead, &dwWritten, NULL);
    }
    WaitForSingleObject(process_info.hProcess, INFINITE);
    printf("Parent exit\n");
}

Ребенок:

#include <windows.h>
#include <iostream>
#define BUFSIZE 4096 
#pragma warning(disable : 4996)
void main()
{
    CHAR chBuf[BUFSIZE];
    scanf("%s", chBuf);
    printf("in Child %s\n", chBuf);
    printf("Child exit\n");
    return;
}

Результат:

enter image description here

0 голосов
/ 07 апреля 2020

Это было какое-то время, но передача DETACHED_PROCESS должна работать.

Если нет, вы можете позвонить CreateProcessWithLogonW, передав ему двоичный файл win32, который вы предоставляете (возможно, свой собственный с различными опциями), что, в свою очередь, будет Вызовите CreateProcess Открытие cmd.exe без прохождения CREATE_NEW_CONSOLE.

Если вы не являетесь администратором, создание в той же консоли совершенно невозможно, и если вы являетесь администратором, это тайная техника, вы лучше выключено не используется.

0 голосов
/ 07 апреля 2020

Вы хотите сказать, что не хотите создавать новое окно? попробуйте startup_info.dwFlags = STARTF_USESHOWWINDOW;startup_info.wShowWindow = SW_HIDE;, тогда окно не будет создано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...