2015-04-14 4 views
2

Problème: J'écris unittests pour un programme d'installation en C++. Le programme d'installation a besoin de droits d'administrateur, mais pas les tests unitaires. Au démarrage des tests, on me demande de démarrer le test/programme en tant qu'administrateur.Comment Windows 7 détermine-t-il si vous avez besoin de droits d'administrateur? (vc60)

Cela a commencé à se produire lorsque j'ai inclus le fichier rc du projet d'origine.

Modifier: Je passais ce projet à VS2010, mais en utilisant toujours vc60, il n'y a donc pas de support manifeste. Cela pourrait être lié.

+1

Petite raison pour ne pas nous dire ce que le fichier .rc contient. Mais oui, le fait qu'il contienne un manifeste qui utilise 'requireAdminstrator' est la manière normale de demander l'élévation de l'UAC. –

+0

en ce qui concerne la réponse, c'est la mauvaise partie: VALUE "FileDescription", "Module d'installation" VALUE "InternalName", "SETUP" Configuration VALUE "OriginalFilename", "SETUP.EXE" VALEUR "ProductName", » Module " rien de tel que manifeste défini ici :) – TheTrowser

Répondre

1

Généralement, les ressources contiennent un manifeste et une partie du manifeste indique si le programme a besoin d'un accès administrateur. Comme il s'agit d'un utilitaire d'installation, il a probablement un manifeste nécessitant un accès administrateur et vos tests l'ont détecté lorsqu'il a tenté de partager le fichier de ressources.

(D'autres personnes parlent de l'heuristique utilisée pour deviner si un programme a besoin d'un accès administrateur quand il n'a pas de manifeste.Par exemple, si vous avez un ancien programme qui a été créé avant que les fichiers manifestes soient communs, le système d'exploitation peut-être essayer de deviner si c'est un installateur en cherchant certaines expressions comme "setup" dans le nom du fichier, je crois qu'il y a d'autres heuristiques aussi, c'est un hack pour les anciens programmes qui ont été écrits avant les manifestes. besoin d'un accès administrateur.)

Vous pouvez résoudre votre problème en fournissant votre propre manifeste. La méthode la plus simple consiste à utiliser l'option de l'éditeur de liens /MANIFESTUAC.

Si vous utilisez une chaîne d'outils plus ancienne, vous devrez probablement créer le fichier manifeste et l'inclure dans vos ressources.

Le manifeste est un fragment de code XML. Le bit important pour vous ressemblerait à quelque chose comme ceci:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <assemblyIdentity version="1.0.0.0" name="yourprogram.exe" type="win32"/> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
     <requestedPrivileges> 
     <requestedExecutionLevel level="asInvoker"/> 
     </requestedPrivileges> 
    </security> 
    </trustInfo> 
</assembly> 

Pour incorporer dans vos ressources, votre fichier .rc devrait avoir:

1 RT_MANIFEST <filename> 

Si votre SDK est si vieux que RT_MANIFEST n'est pas défini , vous pouvez le définir vous-même:

#define RT_MANIFEST 24 
1

Un critère d'évaluation des droits requis pour une application est le nom. Donc, si le nom contient le mot "Setup", il vous sera demandé des droits d'administrateur.

De même, comme cela a commencé avec le fichier rc, un autre critère est les noms écrits dans le fichier rc, sous "Version". Dans mon cas dans "VS_VERSION_INFO". Les entrées suivantes sont ne doivent pas contenir le mot d'installation:

FileDescription 
InternalName 
OriginalFilename 
ProductName 

Vous pourriez changer toute occurrence de « Setup » pour « Settup ». Cela empêcherait le dialogue. Même si, vous ne pourrez peut-être pas changer cela dans le "vrai" fichier rc.

+4

Ou vous pouvez ajouter un fichier manifeste qui indique explicitement à Windows si vous avez ou non besoin de droits d'administrateur. –

+1

Merci pour cette information, si cela est correct. Pouvez-vous pointer vers des documents officiels si tel existe? En supposant que l'information est correcte, ce n'est pas assez inepte et assez hostile pour être Microsoft, il doit sûrement y en avoir plus? –

+0

Je n'ai trouvé aucune ressource officielle, mais j'ai découvert en essayant. Cependant, ce n'est peut-être qu'un problème, si vous n'avez pas de support manifeste, comme je le fais dans ce cas. Il y a juste un commentaire ici: https://msdn.microsoft.com/fr-fr/library/bb384608.aspx – TheTrowser