Manifest in ein Projekt einbinden

Häufig ist es notwendig, dass man einer Anwendung Adminrechte gibt, wenn diese zum Beispiel Netzwerkzugriffe, Registryeingriffe usw. tätigen muss. Dazu muss man eine Anwendungsmanifestdatei in die exe-Datei einkompilieren, in welcher die entsprechenden Benutzerrechte für die Windows-UAC eingetragen sind.

Variante 1:

  1. In Visual Studio 2010 besteht die Möglichkeit eine Manifestdatei erzeugen lassen: im Projekt Rechtsklick auf das Projekt->Hinzufügen->Neues Element …->Anwendungsmanifestdatei. Visual Studio erzeugt unten stehende Datei, wobei die entsprechend benötigten Zeilen aus- bzw. einkommentiert werden müssen:
    <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?->
    <asmv1:assembly manifestVersion=&quot;1.0&quot; xmlns=&quot;urn:schemas-microsoft-com:asm.v1&quot; xmlns:asmv1=&quot;urn:schemas-microsoft-com:asm.v1&quot; xmlns:asmv2=&quot;urn:schemas-microsoft-com:asm.v2&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;->
      <assemblyIdentity version=&quot;1.0.0.0&quot; name=&quot;MyApplication.app&quot;/->
      <trustInfo xmlns=&quot;urn:schemas-microsoft-com:asm.v2&quot;->
        <security->
          <requestedPrivileges xmlns=&quot;urn:schemas-microsoft-com:asm.v3&quot;->
            <!-- UAC-Manifestoptionen
              Wenn Sie die Zugangsebene für das Windows-Benutzerkonto ändern möchten, ersetzen Sie den 
              requestedExecutionLevel-Knoten durch eines der folgenden Elemente.
    
            <requestedExecutionLevel  level=&quot;asInvoker&quot; uiAccess=&quot;false&quot; /->
            <requestedExecutionLevel  level=&quot;requireAdministrator&quot; uiAccess=&quot;false&quot; /->
            <requestedExecutionLevel  level=&quot;highestAvailable&quot; uiAccess=&quot;false&quot; /->
    
                Durch Angeben des requestedExecutionLevel-Knotens wird die Datei- und Registrierungsvirtualisierung deaktiviert.
                Wenn Sie Datei- und Registrierungsvirtualisierung für Abwärts- 
                kompatibilität verwenden möchten, löschen Sie den requestedExecutionLevel-Knoten.
            -->
            <requestedExecutionLevel level=&quot;asInvoker&quot; uiAccess=&quot;false&quot; /->
          </requestedPrivileges->
        </security->
      </trustInfo->
      
      <compatibility xmlns=&quot;urn:schemas-microsoft-com:compatibility.v1&quot;->
        <application->
          <!-- Eine Liste aller Windows-Versionen, mit denen die Anwendung kompatibel ist. Windows wählt automatisch die am stärksten kompatible Umgebung aus.-->
    
          <!-- Wenn die Anwendung mit Windows 7 kompatibel ist, heben Sie die Kommentierung des folgenden supportedOS-Knotens auf.-->
          <!--<supportedOS Id=&quot;{35138b9a-5d96-4fbd-8e2d-a2440225f93a}&quot;/->-->
          
        </application->
      </compatibility->
      
      <!-- Designs für allgemeine Windows-Steuerelemente und -Dialogfelder (Windows XP und höher) aktivieren -->
      <!-- <dependency->
        <dependentAssembly->
          <assemblyIdentity
              type=&quot;win32&quot;
              name=&quot;Microsoft.Windows.Common-Controls&quot;
              version=&quot;6.0.0.0&quot;
              processorArchitecture=&quot;*&quot;
              publicKeyToken=&quot;6595b64144ccf1df&quot;
              language=&quot;*&quot;
            /->
        </dependentAssembly->
      </dependency->-->
    
    </asmv1:assembly->
    
  2. eine Anwendungsmanifestdatei für Windows 7 und mit Zugriffsrechten “Admin” sieht beispielhaft so aus:
    <?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?->
    <asmv1:assembly manifestVersion=&quot;1.0&quot; xmlns=&quot;urn:schemas-microsoft-com:asm.v1&quot; xmlns:asmv1=&quot;urn:schemas-microsoft-com:asm.v1&quot; xmlns:asmv2=&quot;urn:schemas-microsoft-com:asm.v2&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;->
      <assemblyIdentity version=&quot;1.0.0.0&quot; name=&quot;MyApplication.app&quot;/->
      <trustInfo xmlns=&quot;urn:schemas-microsoft-com:asm.v2&quot;->
        <security->
          <requestedPrivileges xmlns=&quot;urn:schemas-microsoft-com:asm.v3&quot;->
            <requestedExecutionLevel level=&quot;requireAdministrator&quot; uiAccess=&quot;false&quot; /->
          </requestedPrivileges->
        </security->
      </trustInfo->
      
      <compatibility xmlns=&quot;urn:schemas-microsoft-com:compatibility.v1&quot;->
        <application->
          <supportedOS Id=&quot;{35138b9a-5d96-4fbd-8e2d-a2440225f93a}&quot;/->
        </application->
      </compatibility->
      
      <!-- Designs für allgemeine Windows-Steuerelemente und -Dialogfelder (Windows XP und höher) aktivieren -->
      <!-- <dependency->
        <dependentAssembly->
          <assemblyIdentity
              type=&quot;win32&quot;
              name=&quot;Microsoft.Windows.Common-Controls&quot;
              version=&quot;6.0.0.0&quot;
              processorArchitecture=&quot;*&quot;
              publicKeyToken=&quot;6595b64144ccf1df&quot;
              language=&quot;*&quot;
            /->
        </dependentAssembly->
      </dependency->-->
    
    </asmv1:assembly->
    
  3. Die Manifestdatei muss unter Projektbaum->Eigenschaften->Anwendung->Symbol und Manifest->Manifest (Datei “app.manifest”) ausgewählt sein, damit sie von Visual Studio mit in die Anwendung einkompiliert wird.
  4. Die im Ausgabeverzeichnis fertig kompilierte Anwendung sollte nun ein Security-Schild im Icon haben.
  5. Nach dem Start der Anwendung fragt Windows-UAC nun, ob das Programm mit Adminrechten ausgeführt werden darf.

Variante 2:

  1. Diese manuelle Variante funktioniert nur mit VS Standard oder Professional, nicht mit Express, da bei letzterem keine Post Build Events eingestellt werden können.
  2. Manifestdatei in einem Editor erzeugen, Projektnamen bei “name” korrekt eintragen, Prozessorarchitektur anpassen und im Ausgabeverzeichnis des Projektes speichern. Eine Beispieldatei zum Erlangen von Adminrechten siehe oben unter Punkt 2 bei Varante 1.
  3. Mittels mt.exe wird nun die Manifestdatei in die ausführbare Datei als Win32-Resource eingebunden. Die prinzipielle Kommandozeile dazu lautet:
    mt.exe –manifest temp.manifest –outputresource:YourApp.exe;#1
    

    Dazu unter Projektbaum->Projekt->Eigenschaften->Buildereignisse->Befehlszeile für Postbuild-Ereignis folgende Zeile eintragen:

    "$(DevEnvDir)..\..\SDK\v2.0\bin\mt.exe" -manifest "$(ProjectDir)$(TargetName).exe.manifest"  –outputresource:"$(TargetDir)$(TargetFileName)";#1
    

    bei anderen VS-Versionen alternativ auch:

    "c:\Programme\Microsoft SDKs\Windows\v7.0A\bin\mt.exe" -manifest "$(ProjectDir)$(TargetName).exe.manifest"  –outputresource:"$(TargetDir)$(TargetFileName)";#1
    
  4. Die im Ausgabeverzeichnis fertig kompilierte Anwendung sollte nun ein Security-Schild im Icon haben.
  5. Nach dem Start der Anwendung frag Windows-UAC nun, ob das Programm mit Adminrechten ausgeführt werden darf.