c ++ createprocess as administrator并获取其输出

时间:2013-11-14 14:02:43

标签: c++ winapi createprocess shellexecuteex

我遇到了问题,我一直在寻找两件必须合作的事情,以管理员身份运行Createprocess()并获得输出。

当我谷歌如何CreateProcess()作为管理员时,我会让人们回复使用shellexecute。我去shellexecute,当我在那里时,shellexecute不会输出在控制台(进程)上运行的内容。

我再次谷歌如何获取带有shellexecute的进程的输出,我得到答案,说你不能用shellexecute做这个,使用createprocess,所以我去创建进程。我正在努力将我正在使用shellexecute转换为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。所以我需要输出。

2 个答案:

答案 0 :(得分:2)

尝试使用本文中的CreateProcessElevated()函数:

Vista UAC: The Definitive Guide

它具有与CreateProcess()相同的功能,但提供runas ShellExecute()功能,即提示用户输入UAC提升凭据。

答案 1 :(得分:1)

您的代码实际上是创建了两个进程runas.exenetsh.exe,它只能创建一个进程。正确的做法是:

  1. 使用具有管理员凭据的LogonUser()个函数来获取管理令牌。
  2. 使用您的IO重定向拨打CreateProcessAsUser()上述令牌。
  3. 请注意,对于CreateProcessAsUser(),您应指定netsh.exe作为您要执行的流程,并将您的参数指定为LPTSTR lpCommandLine