【问题标题】:How to run application which requires admin rights from one that doesn't have them [closed]如何运行需要管理员权限的应用程序没有管理员权限[关闭]
【发布时间】:2012-07-20 19:55:02
【问题描述】:

我已经坚持了几个小时,直到我终于设法做到了。已经有链接为我指明了正确的方向:

但我认为对问题的简单概述可以帮助某人:)。

【问题讨论】:

  • LogonUser 应该可以正常工作,我想。它在描述中提到了创建流程。
  • ....你的问题是什么?
  • 不是,它是为遇到和我一样麻烦的人提供的解决方案。
  • 这是一个合法的 C++/Windows SDK 问题。显然,OP 正在询问 Windows API 调用CreateProcess,并提供错误代码(740,The requested operation requires elevation.)。对于使用 Windows SDK 使用 C++ 编程的任何人来说,理解所要求的内容并不困难。我提名它重新开放。

标签: c++ winapi uac shellexecute createprocess


【解决方案1】:

真正的问题:(来自维基百科:http://en.wikipedia.org/wiki/User_Account_Control

在其清单中标记为“requireAdministrator”的可执行文件无法使用 CreateProcess() 从非提升进程启动。相反,将返回 ERROR_ELEVATION_REQUIRED。必须改用 ShellExecute() 或 ShellExecuteEx()。

(顺便说一句,ERROR_ELEVATION_REQUIRED 错误 == 740)

解决方案:(同一站点)

在本机 Win32 应用程序中,可以将相同的“runas”动词添加到 ShellExecute() 或 ShellExecuteEx() 调用中。

ShellExecute(hwnd, "runas", "C:\\Windows\\Notepad.exe", 0, 0, SW_SHOWNORMAL);

这可能也有帮助:(来源:http://mark.koli.ch/2009/12/uac-prompt-from-java-createprocess-error740-the-requested-operation-requires-elevation.html

2 - 基本 UAC 流程

好的,所以在深入研究之前,我认为解释一下 UAC 感知应用程序的基本流程以及所有内容如何组合在一起可能会有所帮助。通常,您的应用程序作为非特权用户运行。但是,有时它需要成为管理员(做任何事情)。所以,这是基本的想法,在伪代码中:

int main (int argc, char **argv) {

  HRESULT operation = tryToDoSomethingPrivileged();

  if (operation == ACCESS_DENIED && !alreadyElevated) {

    // Spawn a copy of ourselves, via ShellExecuteEx().
    // The "runas" verb is important because that's what
    // internally triggers Windows to open up a UAC prompt.
    HANDLE child = ShellExecuteEx(argc, argv, "runas");

    if (child) {
      // User accepted UAC prompt (gave permission).
      // The unprivileged parent should wait for
      // the privileged child to finish.
      WaitForSingleObject(child, INFINITE);
      CloseHandle(pid);
    }
    else {
      // User rejected UAC prompt.
      return FAILURE;
    }

    return SUCCESS;

  }  

  return SUCCESS;

}

最后,我是这样做的:

if(0 == CreateProcess(argv[2], params, NULL, NULL, false, 0, NULL, NULL, &si, &pi)) {
        //runas word is a hack to require UAC elevation
        ShellExecute(NULL, "runas", argv[2], params, NULL, SW_SHOWNORMAL);
}

为了完整起见 - MSDN 链接到 ShellExecute 和 CreateProcess:

http://msdn.microsoft.com/en-us/library/bb762153%28v=vs.85%29.aspx

http://msdn.microsoft.com/en-us/library/ms682425%28VS.85%29.aspx

【讨论】:

  • 我在我的一个应用程序中使用了相同的方法(通过“runas”生成自身的提升副本以执行单个特权任务,其中生成的子进程的命令行告诉它什么要执行的任务),虽然这不是微软更喜欢人们使用 UAC 提升的方式,但它确实适用于主 .exe 上的 UAC 清单过大的情况。 Microsoft 更喜欢将特权任务放在它自己的带有 UAC 清单的 .exe 中,或者放在它自己的通过 COM Elevation 名字对象实例化的 COM 对象中。
  • ShellExecuteEx 接受一个参数,一个指向 SHELLEXECUTEINFO 的指针。 msdn.microsoft.com/en-us/library/windows/desktop/…
  • 我注意到(ShellExecute)的文档中没有提到“runas”操作:甚至该页面上的一些用户也争论使用它是否安全。它工作的事实并不像某些文档说明的那样可靠(因为您必须手动检查它,并且在某些情况下它可能不起作用)。有人对runas的可靠性有一些参考吗?
  • @reallynic ss64.com/vb/shellexecute.html 声明:“如果您在 WOW64(64 位窗口上的 32 位进程)中运行,runas 将失败,例如 %systemroot%\syswow64\cmd.exe ...” ;另外,mfctips.com/2013/01/04/… 值得一读(严格来说可能与 runas 无关)
  • @mlvljr: runas 在生成另一个 32 位进程时在 WOW64 中工作正常。不确定是否会生成 64 位进程,我还没有尝试使用 runas
猜你喜欢
  • 2013-03-04
  • 2014-10-05
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多