Personnalisation d’un fichier de manifeste EXE
Lorsque vous construisez un projet pour une plateforme cible Windows, RAD Studio inclut automatiquement un fichier de manifeste d’application. Vous pouvez utiliser le fichier de manifeste d’application par défaut comme base pour votre fichier de manifeste d’application personnalisé :
<?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>
Création d’un fichier de manifeste d’application personnalisé
Pour cela, vous avez besoin d’un programme de piratage/inspection des ressources qui vous permet de modifier le manifeste d’un fichier EXE.
Je utilise personnellement Angus Johnson’s Software depuis longtemps, car c’est simple et agréable à utiliser.
Modification du niveau d’élévation requis
Le manifeste d’application par défaut déclare le niveau d’élévation requis comme asInvoker
. Cela signifie que votre application aura le même niveau d’élévation que son processus parent. Si vous souhaitez élever votre application au niveau d’administrateur de Windows, modifiez simplement la valeur de l’attribut level
dans la balise requestedExecutionLevel
de asInvoker
à requireAdministrator
.
Vous pouvez ajouter cela à la section TrustInfo
, et à la balise <security>
où vous ajouterez à la fois le Level
et le uiAccess
au niveau d’exécution requis :
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
-
uiAccess
-
false — L’application n’a pas besoin de piloter l’entrée de l’interface utilisateur d’une autre fenêtre sur le bureau. Les applications qui ne fournissent pas d’accessibilité doivent définir ce drapeau sur false. Les applications qui sont requises pour piloter l’entrée vers d’autres fenêtres sur le bureau (clavier virtuel, par exemple) doivent définir cette valeur sur true.
-
true — L’application est autorisée à contourner les niveaux de protection de l’interface utilisateur pour piloter l’entrée vers des fenêtres à privilèges plus élevés sur le bureau. Ce paramètre ne doit être utilisé que pour les applications d’accessibilité de l’interface utilisateur.
-
-
Niveau : Ici, vous trouverez un tableau expliquant le niveau déclaré dans le manifeste d’application et son comportement
**
Vous trouverez plus d’informations sur le site Web de Microsoft : /MANIFESTUAC (Intègre des informations UAC dans le manifeste)
Modification de la prise en charge du DPI
Pour créer une application DPI-aware, vous devez déclarer la prise en charge du DPI dans le manifeste de l’application. Par exemple, pour déclarer que votre application est DPI-aware par moniteur, ajoutez le code suivant avant la balise de fermeture </assembly>
:
<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>
Test des privilèges d’administration
Le code suivant peut servir de test rapide pour vérifier si votre application nécessite (et obtient correctement) les privilèges de niveau Administrateur. Déclarez le niveau d’élévation requis de votre application comme requireAdministrator
et exécutez la procédure suivante :
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("Impossible d'écrire dans le registre. Votre application n'a PAS les privilèges de niveau Administrateur.",
TMsgDlgType::mtError, mbOKCancel, 0);
}else{
MessageDlg("Écriture dans le registre autorisée. Votre application a les privilèges de niveau Administrateur.",
TMsgDlgType::mtInformation, mbOKCancel, 0);
}
reg->CloseKey();
reg->Free;
}
-
L’application affiche l’un des messages suivants :
-
Impossible d’écrire dans le registre. Votre application n’a PAS les privilèges de niveau Administrateur.
-
Écriture dans le registre autorisée. Votre application a les privilèges de niveau Administrateur.
-
Ce test fonctionne car vous avez besoin de privilèges de niveau Administrateur pour écrire dans la section HKEY_LOCAL_MACHINE\Software
du registre.
Le snippet ne modifie rien dans le registre, il ne demande que la permission d’écriture.
Assurez-vous de construire votre application et de l’exécuter en dehors de l’IDE, car l’IDE déboguera l’application avec les privilèges d’administrateur par défaut (sans respecter votre manifeste d’application).
© 2021 - Sofiane Hamlaooui - Faire du monde un endroit meilleur 🌎
Discussion
Laisser un commentaire
Les commentaires des invités seront examinés avant d'apparaître sur le site.
Aucun commentaire pour le moment. Soyez le premier à commencer la discussion !