问题描述
我正在尝试用 C 为 Windows 编写一个简单的应用程序,我希望它以提升的权限运行。这工作正常,但如果用户拒绝 UAC 提示,我希望以较低的权限使其工作。
这是我的清单文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0"
processorArchitecture="X86"
name="reverse_shell"
type="win32"/>
<description>Description of your application</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="highestAvailable"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
对不起,如果我没有足够好地指定它......
我希望我的代码像这样工作:
感谢您的帮助
解决方法
通过使用清单,您通知操作系统您的完整程序需要请求的权限。
不过,您所描述的是一个只有一个代码路径的程序,它实际上需要这些权限,而另一个则不需要。 在这种情况下,最好以编程方式从程序代码中请求权限,而不是通过清单(在启动实际应用程序之前由操作系统处理)。
问题是没有提供这个(就我的快速谷歌显示而言),所以另一种方法是编写一个包装器(或以某种方式将逻辑保存在同一个应用程序中),它在没有权限的情况下启动,然后尝试运行具有提升权限的实际程序,如果失败,则在没有提升权限的情况下运行实际程序。
,检查程序的命令行,是否包含“-low”。如果它包含“-low”,则以较低的权限运行程序。如果您的程序的命令行不包含任何内容,请使用 IsUserAndmin 来检查用户是否为管理员。如果为 true,请以更高的权限运行您的代码。如果为 false,则将 GetModuleFileName 与 ShellExecute 和“runas”一起用作 lpOperation 并检查 ShellExecute 的返回值。如果返回值为 5,则使用 ShellExecute 并以“-low”作为参数运行您的程序。如果它没有返回 5,则什么都不做。
,很高兴看到您正在尝试使用 highestAvailable
;不幸的是它不能做你想做的事。
如果用户拒绝 UAC 对话,则不会启动进程。
你可以做的是:
- 用
asInvoker
标记您的应用程序
- 当你的应用启动时,检查用户是否是管理员
- 询问用户是否希望以管理员身份运行应用程序(即 UAC 询问您是否希望以管理员身份运行的方式)
- 如果他们说不,请照常继续您的应用
- 如果他们说是:
- 使用带有
runas
动词的 ShellExecute 重新启动自己 - 并退出您自己的进程
- 使用带有