C++ 如何运行需要管理员权限的应用程序';我没有

C++ 如何运行需要管理员权限的应用程序';我没有,c++,winapi,uac,shellexecute,createprocess,C++,Winapi,Uac,Shellexecute,Createprocess,我在这件事上已经坚持了几个小时,直到我终于做到了。已经有一些链接为我指明了正确的方向: 但我认为简单的问题概述可以帮助某人:)。真正的问题:(来自维基百科:) 无法使用CreateProcess()从非提升进程启动清单中标记为“requireAdministrator”的可执行文件。相反,将返回ERROR\u ELEVATION\u REQUIRED。必须改用ShellExecute()或ShellExecuteEx() (顺便说一句,错误\高程\所需错误==740) 解决方案:(同一站

我在这件事上已经坚持了几个小时,直到我终于做到了。已经有一些链接为我指明了正确的方向:

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

真正的问题:(来自维基百科:)

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

(顺便说一句,错误\高程\所需错误==740)

解决方案:(同一站点)

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

ShellExecute(hwnd,“runas”,“C:\\Windows\\Notepad.exe”,0,0,SW\u SHOWNORMAL)

这可能也有帮助:(来源:)

2-基本UAC流量

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

最后,我是这样做的:

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);
}
为了完整性起见-指向ShellExecute和CreateProcess的MSDN链接:


我认为应该很好用。它在描述中提到了创建流程。。。。。你的问题是什么?不是,它是解决和我一样麻烦的人的解决方案。这是一个合法的C++/Windows SDK问题。显然,OP正在询问Windows API调用,
CreateProcess
,并提供错误代码(740,
请求的操作需要提升。
)。了解使用Windows SDK的C++程序中的任何人都不难理解。我指定它重新打开。我在我的一个应用程序中使用了同样的方法(通过“runas”生成自身的提升副本以执行单个特权任务,其中生成的子进程的命令行告诉它要执行什么任务),尽管这不是Microsoft希望人们使用UAC提升的方式,它在main.exe上的UAC清单过多的情况下工作。Microsoft更希望特权任务位于其自己的.exe中,其中包含UAC清单,或者位于其自己的COM对象中,该COM对象通过COM提升名字对象实例化。ShellExecuteEx接受一个参数,即指向SHELLEXECUTEINFO的指针。我注意到(ShellExecute的)文档中没有提到“runas”操作:甚至该页面上的一些用户也在争论使用它是否安全。它工作的事实并不像某些文档所描述的那样可靠(因为你必须亲自检查它,在某些情况下它可能不工作)。是否有人对runas的可靠性有一些参考资料?@reallynic表示:“如果在WOW64(64位windows上的32位进程)中运行,runas将失败,例如%systemroot%\syswow64\cmd.exe…”;另外,这也是一个值得一读的文章(严格来说,可能不是关于runas)@mlvljr:
runas
在WOW64中生成另一个32位进程时可以很好地工作。不确定是否会产生64位进程,我还没有用
运行方式尝试过。
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);
}