【问题标题】:c++ createprocess as administrator and get its outputc++ 以管理员身份创建进程并获取其输出
【发布时间】:2013-11-14 14:02:43
【问题描述】:

我有一个问题,我一直在寻找两个必须在一起的东西,以管理员身份通过Createprocess() 运行一个进程并获取输出。

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

我再次谷歌如何使用 shellexecute 获得进程的输出,我得到的答案说你不能用 shellexecute 做到这一点,使用 createprocess,所以我去 createprocess。我正在努力将我正在使用的 shellexecute 转换为 createprocess。

我用 shellexecute 做的是我正在寻找的东西,以管理员身份运行。但没有输出。

这是我的 shell 执行代码。

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。所以我需要输出。

【问题讨论】:

  • 您好,您能找到解决您这个问题的方法吗?

标签: c++ winapi createprocess shellexecuteex


【解决方案1】:

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

  1. LogonUser() 函数与管理员凭据一起使用,以获取管理令牌。
  2. 使用您的 IO 重定向上述令牌调用 CreateProcessAsUser()

请注意,对于 CreateProcessAsUser(),您应该指定 netsh.exe 作为您要执行的进程,并在 LPTSTR lpCommandLine 中指定参数。

【讨论】:

  • 因为我不知道该计算机中的谁被允许运行管理任务,我将如何在不知道用户名和密码的情况下登录适当的用户
  • 好吧,你只需要知道。否则运行特权代码是没有意义的。
  • 但是先生,您知道有些应用程序会提示管理员的用户名和密码。他们不知道管理员是谁,但他们要求谁是管理员出来授权,这样会更好,而不是在源代码中写用户名和密码
  • 当然。您可以让用户将凭据作为输入参数插入到您的应用程序中,或者,如果是 GUI 应用程序,则为它提示一个表单。
【解决方案2】:

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

Vista UAC: The Definitive Guide

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2013-09-23
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多