【问题标题】:Give Administrator rights to the application授予应用程序管理员权限
【发布时间】:2015-06-22 21:32:40
【问题描述】:

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

【问题讨论】:

    标签: windows permissions


    【解决方案1】:

    我想知道是否有任何简单的方法可以为应用本身授予管理员权限

    您需要为您的应用提供 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)根据需要运行您的管理逻辑。 "runas" 将提升该进程,即使它没有 UAC 清单。如果您的主应用程序需要等待管理进程完成,它可以指定SEE_MASK_NOCLOSEPROCESS 标志为ShellExecuteEx(),然后使用WaitForSingleObject() 或相关函数等待返回的HANDLE,当启动的进程退出。

    2. 将您的管理逻辑移动到一个 COM 对象中,您的主 .exe 可以在需要时使用 COM Elevation Moniker 在提升的状态下实例化该对象。

    这样,您的主要 .exe 不需要使用 requireAdministrator 清单,除非您真的需要整个应用程序以管理员权限运行,否则您应该始终努力避免这种情况。

    【讨论】:

    • 谢谢雷米。是否有一种方法可以命令 Inno Setup 进行所有必要的工作,因此应用程序将从“程序文件”运行?
    • 应用程序无需提升即可从 Program Files 运行。仅当它必须在运行时访问受保护的事物时才需要提升,例如将文件写入 Program Files。但无论如何,如果你创建一个清单,最好将它嵌入到应用程序本身中,但是你可以将它作为一个单独的文件保存在同一个文件夹中的应用程序旁边,Inno 可以安装这样的文件。但我不推荐这种方法。
    • 宾果游戏!如果我告诉 Inno Setup 将 IO 文件放在 Program Files 文件夹之外的单独文件夹中,我认为 exe 文件将在没有提升的情况下运行。对吗?
    • 您说程序需要 Admin priv 以防它需要访问受保护的东西。由于数据文件位于 Program Files 文件夹中,我猜 Windows 不允许在它们上写入,除非 exe 具有 Adm priv。我发现,这就是我以普通用户身份运行时出现访问错误的原因。雷米,我是一个简单的应用程序开发人员。我的目标不是成为每个 TI 主题的专家。因此我在这个网站上提问,否则,没有任何意义。如果出现问题,我会像其他人一样寻求专家的帮助。请耐心等待我:)。
    • 是的,您需要管理员权限才能在 Program Files 中写入文件。这并不意味着您必须将您的应用程序放在 Program Files 中。两种不同的东西。但是,您不应该一开始就在 Program Files 中编写文件,除非您正在编写应用程序安装程序/更新程序,或者如果您有任何其他选择。您的应用创建的文件通常应该写入用户自己的 Documents 或 AppData 文件夹,或者如果多个用户需要访问它们,则写入公共 Documents/AppData 文件夹。
    猜你喜欢
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2020-12-11
    相关资源
    最近更新 更多