winapi — c ++ createprocess от имени администратора и получить его вывод

У меня есть проблема, я искал две вещи, которые должны идти вместе, проходя через процесс Createprocess() как администратор и получить вывод.

Когда я Google, как CreateProcess() как администратор я получаю людей, отвечающих на использование shellexecute, я иду в shellexecuteпока я там, shellexecute не выводит то, что запускалось на консоли (процесс).

Я снова Google, как мне получить выходные данные процесса с shellexecute, я получаю ответы, которые говорят, что вы не можете сделать это с shellexecute, используйте createprocess, поэтому я перехожу к createprocess. Я изо всех сил пытаюсь преобразовать то, что я делаю с shellexecute, для создания процесса.

То, что я делаю с shellexecute, делает то, что я ищу, запускаю от имени администратора. но нет выхода.

Вот мой код шеллекса.

SHELLEXECUTEINFO si = {0};

si.cbSize = sizeof(SHELLEXECUTEINFO);
si.fMask = SEE_MASK_NOCLOSEPROCESS;
si.hwnd =NULL;
si.lpVerb = "runas";
si.lpFile = "netsh.exe";
si.lpParameters = "advfirewall firewall      add rule name=\"dummy_rule\" action=allow protocol=TCP dir=in localport=3300";
si.lpDirectory=NULL;
si.nShow=SW_SHOW;
si.hInstApp =NULL;
ShellExecuteEx(&si);
WaitForSingleObject(si.hProcess, INFINITE);
CloseHandle(si.hProcess);

Этот код выполняется в методе, и он добавляет правило брандмауэра, чтобы открыть порт для входящих соединений. Работает нормально, проблема в том, что я не буду знать, был ли процесс успешным, а не shellexecute. поэтому мне нужен вывод.

0

Решение

Попробуйте CreateProcessElevated() функция из этой статьи:

Vista UAC: полное руководство

Он имеет те же функции, что и CreateProcess() но предлагает runas функциональность ShellExecute()т.е. запрашивая у пользователя учетные данные повышения прав UAC.

2

Другие решения

Ваш код на самом деле создает два процесса runas.exe а также netsh.exe где он может создать только один вместо. Правильный способ сделать это будет:

  1. использование LogonUser() функции с учетными данными администратора, чтобы получить административный токен.
  2. Вызов CreateProcessAsUser() с вашим перенаправлением ввода-вывода а также вышеуказанный токен.

обратите внимание, что для CreateProcessAsUser() Вы должны указать netsh.exe как процесс, который вы хотели бы выполнить, и ваш аргумент в LPTSTR lpCommandLine,

1

По вопросам рекламы [email protected]