У меня есть проблема, я искал две вещи, которые должны идти вместе, проходя через процесс 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. поэтому мне нужен вывод.
Попробуйте CreateProcessElevated()
функция из этой статьи:
Он имеет те же функции, что и CreateProcess()
но предлагает runas
функциональность ShellExecute()
т.е. запрашивая у пользователя учетные данные повышения прав UAC.
Ваш код на самом деле создает два процесса runas.exe
а также netsh.exe
где он может создать только один вместо. Правильный способ сделать это будет:
LogonUser()
функции с учетными данными администратора, чтобы получить административный токен.CreateProcessAsUser()
с вашим перенаправлением ввода-вывода а также вышеуказанный токен.обратите внимание, что для CreateProcessAsUser()
Вы должны указать netsh.exe
как процесс, который вы хотели бы выполнить, и ваш аргумент в LPTSTR lpCommandLine
,