Как создать файл манифеста для запуска приложения с правами администратора? - PullRequest
13 голосов
/ 22 апреля 2011

Я хочу создать файл манифеста для моей программы VB 6.0, чтобы при запуске приложения ОС запрашивала у пользователя права администратора.

Я тоже хочу узнать, как это можно встроить в приложение?

Ответы [ 2 ]

24 голосов
/ 22 апреля 2011

Вы фактически не создаете файл манифеста в VB.Манифест приложения Windows - это стандартный текстовый документ в формате XML.Вы можете создать его в Блокноте и сохранить его с соответствующим именем файла в каталоге вашего приложения (YourAppName.exe.manifest).

У Microsoft есть больше информации, доступной здесь: Манифесты приложений .Он даже включает в себя пример манифеста, который вы можете просто скопировать и вставить в пустой текстовый файл для начала работы.

Важно, если вы хотите, чтобы ваше приложение запрашивало у пользователя повышение прав, - это установить requestedExecutionLevel до 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>

Традиционный способ встраивания манифеста висполняемый файл использует утилиту mt.exe , доступную как часть Windows SDK.

На сайте VBAccelerator также есть некоторая информация о встраивании манифестов в VB 6приложение.В частности, в нем говорится:

Существует два способа предоставления манифеста: самый простой (но наименее элегантный) способ - предоставить манифест на диске для исполняемого файла.Допустим, ваше приложение называется TimeSlot.exe.Затем, если вы сохраните вышеуказанный XML-манифест как

TimeSlot.exe.manifest

в том же каталоге, что и исполняемый файл, TimeSlot.exe автоматически получит стили XP.VB5 и VB6 приведены примеры.Если вы переименуете файл .manifest до запуска приложения, вы можете отключить стили XP.

Более надежный метод - скомпилировать манифест в качестве ресурса в вашем приложении.Для этого манифест должен иметь вид ресурса RT_MANIFEST (24) с идентификатором CREATEPROCESS_MANIFEST_RESOURCE_ID (1).По какой-то странной причине вы должны также убедиться, что результирующий XML-файл имеет длину, кратную 4 байтам.Так, например, если ваш файл на самом деле имеет размер 597 байт, вам нужно добавить пробел, чтобы довести размер файла до 600 байт перед компиляцией.Примеры ресурсов демонстрируют, как создать этот файл ресурсов, используя скрипт компилятора ресурсов (файл .rc) и RC.exe.

Но если вы хотите встроить манифест автоматически , когдавы создаете свое приложение из VB 6 IDE, вам будет немного сложнее.IDE VB 6 не поддерживает шаги после сборки, поэтому вы не можете просто запустить mt.exe в командной строке, чтобы сделать это за вас. - это пара утилит, которые я видел по сети, которые утверждают, что автоматически встраивают манифесты для вас, но я считаю, что большинство из них - это старые утилиты, которые обрабатывают только запрос v6 файла ComCtl32.dll.Я не уверен, могут ли они быть легко расширяемыми для включения разрешений UAC, но это стоит попробовать.Вот несколько ссылок для проверки:

6 голосов
/ 28 февраля 2013

Вот способ включить манифест во время сборки вашего приложения VB6:

  1. Сохраните файл манифеста, возможно, назовите его my.manifest.
  2. Убедитесь, что размер файла кратен четырем, как уже упоминал Коди. При необходимости дополните его пробелами в конце.
    См. Также: Встраивание манифеста приложения в исполняемый файл VB6
  3. Создайте файл ресурсов "my.rc" со следующим содержимым:

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

    Более подробную информацию о константах можно найти в msdn блогах . Кажется, вам нужно использовать

    #define ISOLATIONAWARE_MANIFEST_RESOURCE_ID 2
    

    для проекта dll.

  4. Используйте rc.exe, чтобы скомпилировать этот файл .rc в файл .res.
  5. Добавьте полученный файл .res в ваш проект VB6.

Я использую это последние несколько месяцев без проблем, на двух старых старых приложениях, которые должны были работать на Windows 7. Возможно, вам придется поэкспериментировать с тем, как вы сохраняете файл манифеста, а я сохраняю его только UTF8 без спецификации работал нормально.

Чтобы проверить, что именно встраивается в манифест таким образом, вы также можете использовать mt.exe для извлечения манифеста из вашего скомпилированного exe / dll. Именно это помогло мне найти проблему спецификации ...

...