Question

[Je suis désolé que ce ne soit pas directement une question de programmation. Mais je suis récemment passé à une nouvelle machine Vista où je garde l'UAC activé (s'il vous plaît ne me dites pas de le désactiver, ce n'est pas une option).]

Chaque fois que je lance le patch.exe de gnu je reçois une boîte de dialogue d'élévation de Vista. Si je renomme patch.exe à foo.exe il ne le fait pas, donc je suppose que c'est l'un des « heuristiques » de Vista.

Quelqu'un sait-il comment désactiver cela? Il me conduit les noix et les Googles ne sont pas aider.

Ou devrais-je ajouter un manifeste juste pour patch.exe pour indiquer au système de ne pas essayer d'élever ce? Est-ce que le travail, et si oui, comment faites-vous un tel manifeste?

Merci beaucoup, se cogne la tête contre le mur pendant une heure ce jusqu'à présent.

Était-ce utile?

La solution

De:
http: // sociale .msdn.microsoft.com / Forums / en-US / windowsgeneraldevelopmentissues / fil / bf4f7dfa-5553-41d3-9c8e-311ee4a88599 /

  

Si vous pouvez ajouter un manifeste à la   exécutable concernés déclarant une   requestedExecutionLevel de 'asInvoker'   il devrait cesser de demander.

Guide associé sur l'architecture et la conversion des applications UAC existantes afin qu'ils fonctionnent correctement (près du cinquième bas de la page):

http://technet.microsoft.com/en-us/library /cc709628.aspx

Enfin, comment écrire un manifeste:

http://www.google.com/search?q = écriture + a + + manifeste uac

-Adam

Autres conseils

Le problème est que votre application ne contient pas d'assemblage manifeste avec requestedExectutionLevel .

Arrière-plan

Toutes les applications Windows écrites correctement sont tenus d'avoir un manifeste d'assemblage. Et à partir de 2006 l'un des éléments que vous êtes tenus d'avoir un qui spécifie si votre application ne peut fonctionner que requestedExecutionLevel si l'utilisateur est un administrateur.

Si votre application ne dispose pas d'un manifeste de montage, ou si elle n'a pas de requestedExecutionLevel Windows suppose qu'il est un héritage application et faire les choses dans l'espoir de garder il en cours d'exécution.

Une chose de compatibilité pour les applications existantes est que certains d'entre eux pourrait être un installateur ou un udpater, et ne peut fonctionner lorsqu'il est exécuté en tant qu'administrateur. Windows essaie de deviner ces applications par leurs noms de fichiers:

  • Configuration
  • mise à jour
  • Écusson

sont tous des exemples de noms de fichiers capturés par des heuristiques de compatibilité qui essaient d'élever automatiquement pour l'utilisateur.

Si l'application n'a pas manifeste d'assemblage, il n'est pas une application Windows valide écrite.

La bonne solution

La bonne solution est d'ajouter l'assemblage manifeste que toutes les applications correctes auront. Ce désactivé heuristiques.

Un échantillon contrôle de compte "asInvoker" manifeste:

<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
      <security>
         <requestedPrivileges>
            <requestedExecutionLevel level="asInvoker" />
         </requestedPrivileges>
      </security>
   </trustInfo>
</assembly> 

Dans mon cas, je devais écrire un programme d'emballage qui fait ce qui suit:

1 Copier fichier "patch.exe" dans le dossier temporaire du système (% TMP%) avec un autre nom: "apply.exe"

2-exécution "TMP%% \ apply.exe" avec les arguments souhaités.

3 Supprimer "% TMP% \ apply.exe" fichier

Vous ne aurez pas besoin d'écrire un manifeste.

Si vous devez calculer le "patch.exe" chemin complet, en supposant que le fichier .exe est la variable d'environnement% PATH%, vous pouvez utiliser le code suivant dans C #:

public string GetPatchInstallPath()
{
    StringDictionary env = 
    System.Diagnostics.Process.GetCurrentProcess().StartInfo.EnvironmentVariables;
    string pathEnvVble = env["PATH"];
    string[] paths = new string[]{};
    paths = pathEnvVble.Split(new char[] { ';' });

    foreach (string p in paths)
    {
       string fullPath = Path.Combine(p, "patch.exe");
       if (File.Exists(fullPath))
           return fullPath;
    }
    return string.Empty;
}

Dans le cas contraire, vous pouvez passer le chemin complet patch.exe à votre programme d'emballage si vous ne voulez pas ajouter une nouvelle entrée à la variable% PATH% pour l'emplacement de votre patch.exe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top