赋予应用程序管理员权限

4

我使用Inno Setup生成应用程序安装程序。它成功安装了应用程序,但我只能以管理员身份运行它。由于我不希望用户右键单击exe文件并选择“以管理员身份运行”,我想知道是否有任何简单的方法授予应用程序本身管理员特权,或通过代码授予这些特权。 谢谢。

1个回答

4
我想知道是否有一种简单的方法将管理员权限授予应用程序本身。
您需要为您的应用程序提供一个UAC清单,并将其requestedExecutionLevel值设置为requireAdministrator
创建一个带有.manifest文件扩展名的文本文件,并在其中放置以下XML:
<?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="*" name="MyAppAssemblyNameHere" type="win32"/>
  <description>My App Description</description>
  <!-- uncomment this to enable ComCtl v6 Visual Styles...
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
    </dependentAssembly>
  </dependency>
  -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

创建一个扩展名为.rc的文本文件,并让它引用.manifest文件:
1 24 "myapp.manifest"

使用命令行工具brcc32.exe.rc文件编译成.res文件。
brcc32 myapp.rc

在你的项目中,转到 项目 > 选项 > 应用程序 并取消选择“启用运行时主题”复选框。这将禁用 Delphi 的默认清单,仅启用 ComCtl v6 可视样式(这就是为什么您需要在自定义清单中手动启用样式的原因)。
现在将已编译的 .res 文件添加到您的项目中,并构建。

或者通过代码授予这些权限。

不直接可以。UAC 提升只会发生在进程启动时。一旦进程开始运行,就无法动态提升。但是,您可以执行以下操作之一:
1. 使用 "runas" 动词调用 ShellExecute/Ex() 来启动另一个副本的应用程序,并附加一个额外的命令行参数(或单独的 .exe),以根据需要运行您的管理逻辑。即使没有 UAC 清单,"runas" 将提升该进程。如果主应用程序需要等待管理员进程完成,则可以指定 SEE_MASK_NOCLOSEPROCESS 标志到 ShellExecuteEx(),然后使用 WaitForSingleObject() 或相关函数等待返回的 HANDLE,该句柄在启动的进程退出时将被发信号。
2. 将您的管理逻辑移动到一个 COM 对象中,您的主 .exe 可以在需要时以提升状态实例化该对象,使用 COM 提升单元
这样,您的主要 .exe 不需要使用 requireAdministrator 清单,除非您真正需要整个应用程序以管理员权限运行。

1
一个应用程序可以从Program Files运行,而不需要提升权限。只有在运行时需要访问受保护的内容,比如写入文件到Program Files时才需要提升权限。但无论如何,如果您创建了一个清单文件,最好将其嵌入到应用程序本身中,但是您也可以将其保存为与应用程序位于同一文件夹中的单独文件,并且Inno可以安装这样的文件。但我不建议采用这种方法。 - Remy Lebeau
1
太棒了!如果我告诉Inno Setup将IO文件放在一个单独的文件夹中,而不是Program Files文件夹中,我想exe文件将不需要提权就可以运行。正确吗? - user2383818
1
你说程序需要管理员权限,以防需要访问受保护的内容。由于数据文件在Program Files文件夹中,我猜Windows不会允许对它们进行写入,除非exe具有管理员权限。这就是为什么我以普通用户身份运行时会出现访问错误的原因。Remy,我只是一个简单而谦虚的应用程序开发者。我的目标不是成为每个TI主题的专家。因此,我在这个网站上提出问题,否则就没有意义了。如果出现问题,我会像其他人一样向专家寻求帮助。请耐心等待我的回复 :)。 - user2383818
1
是的,在Program Files中写文件需要管理员权限。这并不意味着您必须将应用程序放在Program Files中。这是两件不同的事情。但是,除非您正在编写应用程序安装程序/更新程序或者没有其他选择,否则不应该在Program Files中编写文件。应用程序创建的文件通常应该写入用户自己的Documents或AppData文件夹中,或者如果多个用户需要访问它们,则应写入公共Documents/AppData文件夹中。 - Remy Lebeau
@FlashThunder 哪一部分?我所描述的一切在Win10中仍然适用。 - Remy Lebeau
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接