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:
- 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="1.0" encoding="utf-8"?-> <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"-> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/-> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"-> <security-> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"-> <!-- 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="asInvoker" uiAccess="false" /-> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /-> <requestedExecutionLevel level="highestAvailable" uiAccess="false" /-> 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="asInvoker" uiAccess="false" /-> </requestedPrivileges-> </security-> </trustInfo-> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"-> <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="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/->--> </application-> </compatibility-> <!-- Designs für allgemeine Windows-Steuerelemente und -Dialogfelder (Windows XP und höher) aktivieren --> <!-- <dependency-> <dependentAssembly-> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /-> </dependentAssembly-> </dependency->--> </asmv1:assembly->
- eine Anwendungsmanifestdatei für Windows 7 und mit Zugriffsrechten „Admin“ sieht beispielhaft so aus:
<?xml version="1.0" encoding="utf-8"?-> <asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"-> <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/-> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"-> <security-> <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"-> <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /-> </requestedPrivileges-> </security-> </trustInfo-> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"-> <application-> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/-> </application-> </compatibility-> <!-- Designs für allgemeine Windows-Steuerelemente und -Dialogfelder (Windows XP und höher) aktivieren --> <!-- <dependency-> <dependentAssembly-> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" /-> </dependentAssembly-> </dependency->--> </asmv1:assembly->
- 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.
- Die im Ausgabeverzeichnis fertig kompilierte Anwendung sollte nun ein Security-Schild im Icon haben.
- Nach dem Start der Anwendung fragt Windows-UAC nun, ob das Programm mit Adminrechten ausgeführt werden darf.
Variante 2:
- Diese manuelle Variante funktioniert nur mit VS Standard oder Professional, nicht mit Express, da bei letzterem keine Post Build Events eingestellt werden können.
- 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.
- 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
- Die im Ausgabeverzeichnis fertig kompilierte Anwendung sollte nun ein Security-Schild im Icon haben.
- Nach dem Start der Anwendung frag Windows-UAC nun, ob das Programm mit Adminrechten ausgeführt werden darf.