Personnalisation du fichier manifeste d'une application Windows

De RAD Studio
Aller à : navigation, rechercher

Remonter à Types d'applications multi-périphériques que vous pouvez créer

Remonter à Déploiement des applications - Présentation


Lorsque vous construisez un projet pour la plate-forme cible Windows, RAD Studio inclut automatiquement un fichier manifeste d'application. Vous pouvez utiliser le fichier manifeste d'application par défaut comme base pour votre fichier manifeste personnalisé d'application :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <dependency>
   <dependentAssembly>
     <assemblyIdentity
       type="win32"
       name="Microsoft.Windows.Common-Controls"
       version="6.0.0.0"
       publicKeyToken="6595b64144ccf1df"
       language="*"
       processorArchitecture="*"/>
   </dependentAssembly>
 </dependency>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
   <security>
     <requestedPrivileges>
       <requestedExecutionLevel
         level="asInvoker"
         uiAccess="false"/>
       </requestedPrivileges>
   </security>
 </trustInfo>
</assembly>

Le fichier manifeste d'application par défaut définit :

  • La prise en charge relative à la version des contrôles communs Windows (Windows Common Controls)
  • Le niveau d'élévation de l'application qui correspond au processus parent.

Création du fichier manifeste personnalisé d'une application

  1. Créez un fichier texte vide.
  2. Copiez-y le fichier manifeste d'application par défaut.
  3. Ajoutez ou modifiez les dépendances (comme le niveau d'élévation requis ou la prise en charge DPI).
  4. Enregistrez le fichier texte avec l'extension .manifest.

Déclaration du niveau d'élévation requis

Le fichier manifeste d'application par défaut déclare le niveau d'élévation requis sous la forme asInvoker. Cela signifie que votre application aura le même niveau d'élévation que son processus parent. Si vous voulez élever votre application au niveau de privilège Administrateur Windows, changez simplement la valeur de l'attribut level dans la balise requestedExecutionLevel de asInvoker en requireAdministrator.

Remarque : L'utilisateur aura encore besoin de privilèges ou d'informations d'identification administrateur pour exécuter l'application avec un niveau de privilège Administrateur.

Le tableau suivant fournit des informations sur le comportement de l'application dans des scénarios courants en rapport avec le niveau d'élévation requis que vous déclarez dans le fichier manifeste de l'application et le niveau du processus parent de l'application :

Niveau déclaré dans le fichier manifeste de l'application Niveau du processus parent Comportement
asInvoker Utilisateur standard L'application démarre en tant qu'utilisateur standard
asInvoker Administrateur L'application démarre avec un accès administratif complet
highestAvailable Utilisateur standard L'application démarre en tant qu'utilisateur standard
highestAvailable Administrateur L'application démarre avec un accès administratif complet
requireAdministrator Utilisateur standard Demande les informations d'identification administrateur avant d'exécuter l'application
requireAdministrator Administrateur L'application démarre avec un accès administratif complet

Pour des informations plus détaillées sur le comportement des applications selon différents paramètres, voir MSDN: Create and Embed an Application Manifest (UAC) (EN)

Déclaration de la prise en charge DPI

Pour créer une application de prise en charge DPI, vous devez déclarer la prise en charge DPI dans le fichier manifeste de l'application. Par exemple, pour déclarer que votre application assure la prise en charge DPI par moniteur, ajoutez ce qui suit avant la balise </assembly> de fermeture :

<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
   <asmv3:windowsSettings
        xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
     <dpiAware>True/PM</dpiAware>
   </asmv3:windowsSettings>
</asmv3:application>

Pour des informations plus détaillées, des exemples d'application et des extraits de code relatifs à la prise en charge DPI, voir le document Delphi Developers Guide 4K.pdf (EN).

Ajout du fichier manifeste de l'application à votre application

  1. Allez dans Projet > Options > Application pour ouvrir la page Options d'applications page.
  2. Choisissez la paire plate-forme-configuration cible.
  3. Sélectionnez Personnalisé dans la boîte à options déroulante Générer automatiquement.
  4. Cliquez sur le bouton ellipse [...] du champ Manifeste personnalisé afin de rechercher votre ficher .manifest.
Remarque : Les options d'applications sont spécifiques à chaque paire plate-forme/configuration. Vous devez définir explicitement le manifeste personnalisé pour chaque paire plate-forme/configuration (il peut s'agir du même fichier .manifest).

Dépannage

Test des privilèges d'administration

L'extrait de code suivant peut vous servir de test rapide pour vérifier si votre application requiert les privilèges de niveau Administrateur (et si ceux-ci lui sont correctement attribués). Déclarez le niveau d'élévation requis de votre application sous la forme requireAdministrator et exécutez la procédure suivante :

Delphi :
uses
System.Win.Registry, Winapi.Windows;
procedure isAdmin();
var
  reg: TRegistry;
  openResult: Boolean;
begin
  reg := TRegistry.Create(KEY_READ);
  reg.RootKey := HKEY_LOCAL_MACHINE;
  reg.Access := KEY_WRITE;
  openResult := reg.OpenKey('Software\MyCompanyName\MyApplication\',True);
  if not openResult = True then
    begin
    MessageDlg('Unable to write to registry. Your application does NOT have Administrator level privileges.',
                TMsgDlgType.mtError, mbOKCancel, 0);
    end
  else
    begin
    MessageDlg('Write to registry permitted. Your application has Administrator level privileges.',
                TMsgDlgType.mtInformation, mbOKCancel, 0);
    end;
  reg.CloseKey();
  reg.Free;
end;
C++ :
#include <System.Win.Registry.hpp>
#include <Winapi.Windows.hpp>
void __fastcall isAdmin(TObject *Sender){
	TRegistry *reg;
	bool openResult;
	reg = new TRegistry(KEY_READ);
	reg->RootKey = HKEY_LOCAL_MACHINE;
	reg->Access = KEY_WRITE;
	openResult = reg->OpenKey("Software\\MyCompanyName\\MyApplication\\" , true);
	if (openResult != true){
		MessageDlg("Unable to write to registry. Your application does NOT have Administrator level privileges.",
					TMsgDlgType::mtError, mbOKCancel, 0);
	}else{
		MessageDlg("Write to registry permitted. Your application has Administrator level privileges.",
					TMsgDlgType::mtInformation, mbOKCancel, 0);
	}
	reg->CloseKey();
	reg->Free;
}

L'application affiche l'un des messages suivants :

  • Unable to write to registry. Your application does NOT have Administrator level privileges.
  • Write to registry permitted. Your application has Administrator level privileges.

Ce test fonctionne parce que vous avez besoin de privilèges de niveau Administrateur pour écrire dans la partie HKEY_LOCAL_MACHINE\Software du registre. En fait, l'extrait n'écrit rien dans le registre, il demande simplement la permission d'écriture.

Vous devez construire votre application puis l'exécuter en dehors de l'EDI, car l'EDI va la déboguer avec des privilèges de niveau Administrateur par défaut (sans tenir compte du fichier manifeste de l'application).

Erreurs

Impossible de créer le processus : L'application n'a pas pu démarrer car sa configuration côte à côte est incorrecte. Consultez le journal d'événements de l'application ou utilisez l'outil de ligne de commande sxstrace.exe pour plus de détails.

  • Cette erreur signifie généralement que vous avez entré une valeur incorrecte quelque part dans le fichier manifeste de l'application. Vérifiez que le fichier manifeste est correctement formaté et que toutes les valeurs fournies sont correctes.
    Remarque : Construisez votre application après avoir changé le fichier manifeste de l'application pour appliquer les changements.

Impossible de créer le processus. L'opération demandée requiert une élévation

  • Cette erreur s'affiche si vous exécutez l'EDI en tant qu'utilisateur standard et que vous tentez de déboguer une application qui requiert des privilèges de niveau Administrateur. La seule manière de déboguer une application qui requiert des privilèges de niveau Administrateur consiste à exécuter l'EDI en tant qu'Administrateur.

Voir aussi