如何创建清单文件以启动具有管理员权限的应用程序?

nig*_*001 13 windows vb6 uac manifest

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

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

Cod*_*ray 24

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

Microsoft在此处提供了更多信息:应用程序清单.它甚至包括一个示例清单,您可以将其复制并粘贴到空白文本文件中以开始使用.

重要的是,如果您希望应用程序提示用户进行提升,则设置为requestedExecutionLevelto requireAdministrator,而不是asInvoker.有关在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="*"
     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>
Run Code Online (Sandbox Code Playgroud)

将清单嵌入可执行文件的传统方法是使用该mt.exe实用程序,它是Windows SDK的一部分.

VBAccelerator网站也有关于在VB 6应用程序中嵌入清单的一些信息.具体来说,它说:

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

TimeSlot.exe.manifest
Run Code Online (Sandbox Code Playgroud)

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

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

但是,如果您想在从VB 6 IDE构建应用程序时自动嵌入清单,那么您将遇到更多困难.VB 6 IDE不支持后期构建步骤,因此您不能简单地mt.exe在命令行上运行来为您执行此操作.有一对夫妇,我在网络上看到的实用程序,声称能自动嵌入清单给你,但我相信大部分都是旧的实用程序,只能处理请求COMCTL32.DLL的V6发动机.我不确定它们是否可以轻松扩展以包含UAC权限,但它值得一试.以下是一些要查看的链接:

  • @Bob:如果您对使用这些工具嵌入清单的详细信息有更多了解,请随时发布答案.你不会偷我的雷声.我还没有在VB 6中构建一个需要提升的应用程序,所以我从来没有把这些工具放在他们的步伐中.我依旧记得使用像MMM这样的东西让我的测试周期在XP时更容易恢复,但在部署之前我总是回到`mt.exe`. (2认同)

tak*_*krl 6

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

  1. 保存您的清单文件,也许称之为"my.manifest".
  2. 确保文件大小是四的倍数,正如Cody已经提到的那样.如有必要,最后用空白填充.
    另请参阅:将应用程序清单嵌入到VB6 exe中
  3. 使用以下内容生成资源文件"my.rc":

    #define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
    #define RT_MANIFEST 24
    CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "my.manifest"
    
    Run Code Online (Sandbox Code Playgroud)

    您可以在msdn博客中找到有关常量的更多信息.似乎你需要使用

    #define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2
    
    Run Code Online (Sandbox Code Playgroud)

    一个DLL项目.

  4. 用于rc.exe将此.rc文件编译为.res文件.
  5. 将生成的.res文件添加到VB6项目中.

在过去的几个月里,我一直在使用这个,需要在Windows 7上运行两个旧的遗留应用程序.您可能需要试验如何保存清单文件,但我只能将其保存为UTF8而不需要BOM工作正常.

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