Domanda

[Mi dispiace che questa non sia direttamente una domanda di programmazione.Ma recentemente sono passato a una nuova macchina Vista su cui mantengo abilitato l'UAC (per favore, non dirmi di disabilitarlo, non è un'opzione).]

Ogni volta che eseguo patch.exe di Gnu ricevo una finestra di dialogo di elevazione da Vista.Se rinomino patch.exe in foo.exe non lo fa, quindi presumo che questa sia una delle "euristica" di Vista.

Qualcuno sa come disabilitarlo?Mi sta facendo impazzire e i Google non mi aiutano.

Oppure dovrei aggiungere un manifest solo per patch.exe per dire al sistema di NON tentare di elevarlo?Funzionerà e, in caso affermativo, come si realizza un manifesto del genere?

Grazie mille, è ormai un'ora che sbatto la testa contro il muro per questa cosa.

È stato utile?

Soluzione

Da:
http: // sociale .msdn.microsoft.com / Forum / it-IT / windowsgeneraldevelopmentissues / thread / bf4f7dfa-5553-41d3-9c8e-311ee4a88599 /

  

Se è possibile aggiungere un manifesto alla   eseguibile interessate che dichiarano un   requestedExecutionLevel di 'asInvoker'   si dovrebbe smettere di chiedere conferma.

Guida associati su architettura UAC e la conversione di applicazioni esistenti in modo da funzionare correttamente (vicino alla quinta parte inferiore della pagina):

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

Infine, come scrivere una tale palese:

http://www.google.com/search?q = scrittura + a + UAC + manifesti

-Adam

Altri suggerimenti

Il problema è che la tua applicazione non contiene un manifesto di assembly con a livello di esecuzione richiesto.

Sfondo

Tutte le applicazioni Windows scritte correttamente devono avere un manifesto dell'assembly.E a partire dal 2006 uno degli elementi che devi avere è a livello di esecuzione richiesto che specifica se la tua applicazione può funzionare solo se l'utente è un amministratore.

Se la tua applicazione non ha un manifesto dell'assembly o se non ha un file livello di esecuzione richiesto Windows presuppone che sia un file eredità applicazione e fare cose per mantenerla, si spera, in esecuzione.

Un aspetto della compatibilità per le applicazioni legacy è che alcune di esse potrebbero essere un programma di installazione o un aggiornamento e possono funzionare solo se eseguite come amministratore.Windows tenta di indovinare queste applicazioni in base ai nomi dei file:

  • impostare
  • aggiornamento
  • toppa

Sono tutti esempi di nomi di file rilevati dall'euristica di compatibilità che tentano di elevarsi automaticamente per l'utente.

Se l'applicazione non dispone di manifesto dell'assembly, non è un'applicazione Windows scritta in modo valido.

La soluzione corretta

La soluzione corretta è aggiungere il manifesto dell'assembly che avranno tutte le applicazioni corrette.Ciò ha disabilitato l'euristica.

Un esempio di manifest UAC "asInvoker":

<?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> 

Nel mio caso ho dovuto scrivere un programma wrapper che rende il seguente:

1-Copy file "patch.exe" nella cartella del sistema temp (% TMP%) con un altro nome: "apply.exe"

2-Execute "% TMP% \ apply.exe" con gli argomenti desiderati.

3-Canc "% TMP% \ apply.exe" file

Non avrete bisogno di scrivere un manifesto.

Se è necessario calcolare il "patch.exe" percorso completo, supponendo che il .exe è sulla variabile d'ambiente PATH%%, è possibile utilizzare il seguente codice in 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;
}

In caso contrario, è possibile passare il percorso completo patch.exe al vostro programma wrapper se non si desidera aggiungere una nuova voce alla variabile% PATH% per la vostra posizione patch.exe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top