1

我有一个问题,我一直在寻找必须结合在一起的两件事,Createprocess()以管理员身份运行一个进程并获得输出。

当我CreateProcess()以管理员身份使用 Google 搜索时,我会让人们回复使用shellexecute. 我去shellexecute,当我在那里时,shellexecute 不输出控制台(进程)上运行的内容。

我再次谷歌如何使用 shellexecute 获得进程的输出,我得到的答案说你不能用 shellexecute 做到这一点,使用 createprocess,所以我去 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。所以我需要输出。

4

2 回答 2

2

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

  1. 使用LogonUser()具有管理员凭据的函数来获取管理令牌。
  2. CreateProcessAsUser()使用您的 IO 重定向上述令牌进行调用。

请注意,CreateProcessAsUser()您应该指定netsh.exe您要执行的进程,并将您的参数指定为LPTSTR lpCommandLine.

于 2013-11-14T14:41:24.030 回答
2

尝试CreateProcessElevated()本文中的功能:

Vista UAC:权威指南

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

于 2013-11-14T15:48:08.330 回答