【问题标题】:How do I create a manifest file to launch application with admin privileges?如何创建清单文件以启动具有管理员权限的应用程序?
【发布时间】:2011-08-10 22:58:00
【问题描述】:

我想为我的 VB 6.0 程序创建一个清单文件,这样当我启动我的应用程序时,操作系统应该向用户询问管理员权限。

我也想知道如何将它嵌入到应用程序中?

【问题讨论】:

    标签: windows vb6 uac manifest


    【解决方案1】:

    这是在构建 VB6 应用时包含清单的一种方法:

    1. 保存您的清单文件,可以将其命名为“my.manifest”。

    2. 确保文件大小是四的倍数,正如 Cody 已经提到的。如有必要,请在末尾用空格填充。
      另请参阅:Embedding an application manifest into a VB6 exe

    3. 生成一个资源文件“my.rc”,内容如下:

       #define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
       #define RT_MANIFEST 24
       CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "my.manifest"
      

      您可以在msdn blogs 找到有关使用的常量的更多信息。看来你需要使用

       #define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2
      

      对于一个 dll 项目。

    4. 使用rc.exe 将此.rc 文件编译为.res 文件。

    5. 将生成的 .res 文件添加到您的 VB6 项目中。

    在过去的几个月里,我在两个需要在 Windows 7 上运行的旧旧应用程序上一直使用它,没有出现任何问题。不过,您可能需要尝试如何保存清单文件,因为我只将它保存为没有 BOM 的 UTF8 可以正常工作。

    要检查以这种方式嵌入清单的确切内容,您还可以使用mt.exe 从已编译的 exe/dll 中提取清单。这就是帮助我找到 BOM 问题的原因...

    【讨论】:

      【解决方案2】:

      您实际上并没有在 VB 中创建清单文件。 Windows 应用程序清单是标准文本文档,格式为 XML。您可以在记事本中创建它,然后使用适当的文件名将其保存在应用程序的目录 (YourAppName.exe.manifest) 中。

      Microsoft 在此处提供了更多信息:Application Manifests。它甚至包含一个示例清单,您只需将其复制并粘贴到空白文本文件中即可开始使用。

      如果您希望您的应用程序提示用户提升权限,重要的是将requestedExecutionLevel 设置为requireAdministrator,而不是asInvoker。有关将清单与 UAC 一起使用的具体信息,请参阅 here

      所以一个完整的样本可能看起来像这样:

      <?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="MyMagicalApplication"
           type="win32"
        /> 
        <description>Sample manifest for your super cool application</description> 
      
        <!-- Request version 6 of the common controls. -->
        <dependency>
          <dependentAssembly>
            <assemblyIdentity
              type="win32"
              name="Microsoft.Windows.Common-Controls"
              version="6.0.0.0"
              processorArchitecture="*"
              publicKeyToken="6595b64144ccf1df"
              language="*"
            />
          </dependentAssembly>
       </dependency>
      
        <!-- Identify the application security requirements. -->
        <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
          <security>
            <requestedPrivileges>
              <requestedExecutionLevel
                level="requireAdministrator"
                uiAccess="false"
              />
            </requestedPrivileges>
          </security>
        </trustInfo>
      </assembly>
      

      将清单嵌入可执行文件的传统方法是使用mt.exe utility,它作为 Windows SDK 的一部分提供。

      VBAccelerator site 还包含一些关于在 VB 6 应用程序中嵌入清单的信息。具体来说,它说:

      提供清单有两种方法:最简单(但最不优雅)的方法是在磁盘上为可执行文件提供清单。假设您的应用程序名为 TimeSlot.exe。那么如果你将上面的清单 XML 保存为

      TimeSlot.exe.manifest
      

      在与可执行文件相同的目录下,TimeSlot.exe 会自动获取 XP 样式。提供了 VB5 和 VB6 示例。如果在运行应用程序之前重命名 .manifest 文件,则可以关闭 XP 样式。

      更强大的方法是将清单编译为应用程序中的资源。为此,清单必须显示为资源类型RT_MANIFEST (24),ID 为CREATEPROCESS_MANIFEST_RESOURCE_ID (1)。出于某种奇怪的原因,您必须还确保生成的 XML 文件的长度是 4 个字节的偶数倍。因此,例如,如果您的文件实际上是 597 字节,则需要在编译前添加填充空间以将文件大小弥补为 600 字节。资源示例演示了如何使用资源编译器脚本(.rc 文件)和 RC.exe 创建此资源文件。

      但是,如果您想在从 VB 6 IDE 构建应用程序时自动嵌入清单,那么您将面临更多困难。 VB 6 IDE 不支持构建后步骤,因此您不能简单地在命令行上运行mt.exe 来为您完成。 我在网络上看到了一些声称可以为您自动嵌入清单的实用程序,但我相信其中大多数是旧实用程序,它们只处理请求 ComCtl32.dll 的 v6。我不确定它们是否可以轻松扩展以包含 UAC 权限,但值得一试。以下是一些可以查看的链接:

      【讨论】:

      • MMM 可以创建超越 CC6 和执行级别选择的清单,以创建无注册 COM 和 DLL 重定向的条目。 UMMM 试图克隆它的操作并且在很大程度上成功了。 MMM 肯定可以嵌入清单。还有第 3 方商业工具。
      • @Bob:如果您了解更多关于使用这些工具嵌入清单的详细信息,请随时发布答案。你不会偷走我的风头。我还没有在 VB 6 中构建需要提升的应用程序,所以我从来没有使用过这些工具中的任何一个。我隐约记得在 XP 时代使用 MMM 之类的东西来简化我的测试周期,但在部署之前我总是退回到mt.exe
      • @Cody Gray:你是绝对正确的。通过使用 mt.exe,我们可以轻松地嵌入清单。
      • @Cody:不,我认为你已经很好地涵盖了手头的目的。还有很多其他问题,但它们与流程提升以外的特定情况有关。例如选择 CC6 意味着您需要先加载 shell32.dll,然后在第一次加载表单之前加载 comctl32.dll 以避免致命冲突。不过那是另一个话题了。
      • @Bob:你的意思是你必须显式加载shell32.dll?我不知道。在我没有这样做的项目上,我从来没有遇到过任何麻烦。我原以为 DLL 会自动放置在 VB 6 应用程序的导入表中,因为它被运行时在幕后使用。
      猜你喜欢
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 2021-05-23
      相关资源
      最近更新 更多