J'ai un problème avec le bon vieux bdeadmin.exe de Vista. Commençons par éliminer les réponses prévisibles:
"Vous ne devriez pas exiger que votre demande soit élevée."
Celui-ci fait. C'est la vie.
"Vous devez intégrer un fichier manifeste."
Il est déjà compilé, il a plusieurs années, la société qui l’a créé n’a pas l’intention de le refaire et il est installé à partir d’un module de fusion (fichier MSM).
"BDE est obsolète, vous devriez utiliser dbExpress"
Un million et demi de lignes de code. 'Nuff a dit.
"Déposer un fichier manifeste à côté de l'EXE."
Essayé cela, n'a rien fait. En guise de test, ce même fichier manifeste a pu créer plusieurs autres fichiers EXE nécessitant une élévation, mais pas celui que je voulais. Quelque chose empêche la lecture du manifeste externe.
"Créez un raccourci et définissez SLDF_RUNAS_USER."
Ne peut pas faire ça, c'est un applet du Panneau de configuration.
La seule chose qui a fonctionné a été de définir "Exécuter ce programme en tant qu'administrateur" sous l'onglet Compatibilité de sa fenêtre Propriétés. Je ne devrais pas avoir à dire aux utilisateurs de le faire. Mauvais pour les affaires. J'ai besoin que l'installateur le fasse. Le fichier MSM utilise un chemin statique.
Vous pouvez définir par programme l'indicateur "Exécuter ce programme en tant qu'administrateur" (l'option que vous trouvez dans l'onglet Compatibilité des propriétés d'un fichier EXE), en définissant une simple clé de registre. Vous devez créer une valeur de chaîne (REG_SZ) sous l'une de ces clés (si vous souhaitez que le paramètre soit par utilisateur ou par machine, respectivement):
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
ou
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
Le nom de la valeur doit être le chemin complet de votre exécutable (si le chemin contient des espaces, n'entourez pas le chemin avec des guillemets) et les données de la valeur doivent contenir la chaîne RUNASADMIN
.
Comme échantillon:
reg.exe Add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\Program Files\MyApp\Test.exe" /d "PUT__VALUE__HERE"
Modes de compatibilité
WIN95 Windows 95
WIN98 Windows 98
WIN4SP5 Windows NT 4.0 SP5
WIN2000 Windows 2000
WINXPSP2 Windows XP SP2
WINXPSP3 Windows XP SP3
VISTARTM Vista
VISTASP1 Vista SP1
VISTASP2 Vista SP2
WIN7RTM Windows 7
WINSRV03SP1 Windows Server 2003 SP1
WINSRV08SP1 Windows Server 2008 SP1
Niveau de privilège
RUNASADMIN Exécuter le programme en tant qu'administrateur
REG AJOUTEZ "HKLM\LOGICIEL\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\temp\compatmodel\iconsext.exe"/t REG_SZ/d "WINXPSP3 RUNASADMIN" /F
Références: http://www.verboon.info/2011/03/running-an-application-as-administrator-or-in-compatibility-mode/
Il s’agit d’un long projet, mais si vous avez le mot "setup" ou "install" dans le nom du fichier EXE, Windows vous demandera une élévation lorsqu’il sera exécuté. Je ne sais pas si cela fonctionnera avec un applet du panneau de contrôle, cependant.
Avez-vous essayé Microsoft Application Compatibility Toolkit ? Il analyse votre application et fournit des solutions de compatibilité susceptibles de vous aider à résoudre votre problème.
J'ai constaté que la méthode de fichier .manifest
ne fonctionnait pas si .exe
était sous C:\Program files\...
et si .exe
avait déjà été exécuté sans le fichier .manifest
. Windows se souvient du .manifest
depuis la première exécution du .exe
. Cela signifie que vous ne pouvez pas simplement envoyer le manifeste lorsque les utilisateurs se plaignent que leurs installations ne fonctionnent pas. Le fichier manifeste doit être placé avant ou pendant la même installation que celle qui place le .exe
.
Windows revérifie le .manifest
si le .exe
change (par exemple, nouvelle version ou nombre d'octets différent).
Utilisez un programme qui utilise ShellExecute qui utilise "runas" comme "verbe" pour exécuter le programme souhaité.
Pack votre application dans WinRar SFX avec le mode silencieux + mode de demande admin.
Beaucoup plus simple que de jouer avec les variables .MSI.