如果 Windows UAC 被拒绝,是否有办法让代码以较低的权限运行

问题描述

我正在尝试用 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>

对不起,如果我没有足够好地指定它......

我希望我的代码像这样工作:

  1. 用户运行程序
  2. UAC 出现要求提升权限
  3. 如果用户回答是,一切正常,如果用户回答否,我希望我的代码以低权限运行

感谢您的帮助

解决方法

通过使用清单,您通知操作系统您的完整程序需要请求的权限。

不过,您所描述的是一个只有一个代码路径的程序,它实际上需要这些权限,而另一个则不需要。 在这种情况下,最好以编程方式从程序代码中请求权限,而不是通过清单(在启动实际应用程序之前由操作系统处理)。

问题是没有提供这个(就我的快速谷歌显示而言),所以另一种方法是编写一个包装器(或以某种方式将逻辑保存在同一个应用程序中),它在没有权限的情况下启动,然后尝试运行具有提升权限的实际程序,如果失败,则在没有提升权限的情况下运行实际程序。

,

检查程序的命令行,是否包含“-low”。如果它包含“-low”,则以较低的权限运行程序。如果您的程序的命令行不包含任何内容,请使用 IsUserAndmin 来检查用户是否为管理员。如果为 true,请以更高的权限运行您的代码。如果为 false,则将 GetModuleFileName 与 ShellExecute 和“runas”一起用作 lpOperation 并检查 ShellExecute 的返回值。如果返回值为 5,则使用 ShellExecute 并以“-low”作为参数运行您的程序。如果它没有返回 5,则什么都不做。

,

很高兴看到您正在尝试使用 highestAvailable;不幸的是它不能做你想做的事。

如果用户拒绝 UAC 对话,则不会启动进程。

你可以做的是:

  • asInvoker
  • 标记您的应用程序
  • 当你的应用启动时,检查用户是否是管理员
  • 询问用户是否希望以管理员身份运行应用程序(即 UAC 询问您是否希望以管理员身份运行的方式)
    • 如果他们说,请照常继续您的应用
    • 如果他们说
      • 使用带有 runas 动词的 ShellExecute 重新启动自己
      • 并退出您自己的进程