Pregunta

[Lamento que esto no sea directamente una pregunta de programación.Pero recientemente me cambié a una nueva máquina con Vista donde mantengo UAC habilitado (no me diga que lo desactive, no es una opción).]

Cada vez que ejecuto patch.exe de gnu aparece un cuadro de diálogo de elevación desde Vista.Si cambio el nombre de patch.exe a foo.exe, no hace esto, así que supongo que se trata de una de las "heurísticas" de Vista.

¿Alguien sabe cómo desactivar esto?Me está volviendo loco y los Google no ayudan.

¿O debería agregar un manifiesto solo para patch.exe para indicarle al sistema que NO intente elevar esto?¿Funcionará? De ser así, ¿cómo se hace ese manifiesto?

Muchas gracias, hasta ahora me he estado golpeando la cabeza contra la pared durante una hora con esto.

¿Fue útil?

Solución

De:
http: // sociales .msdn.microsoft.com / foros / en-US / windowsgeneraldevelopmentissues / hilo / bf4f7dfa-5553-41d3-9c8e-311ee4a88599 /

  

Si usted puede agregar un manifiesto a la   ejecutable afectados declaren una   requestedExecutionLevel de 'asInvoker'   debe dejar de preguntar.

guía asociado en la arquitectura UAC y la conversión de las aplicaciones existentes para que funcionen correctamente (cerca de la quinta parte inferior de la página):

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

Por último, la forma de escribir un manifiesto tales:

http://www.google.com/search?q = escritura + a + + UAC manifiesta

-Adán

Otros consejos

El problema es que su aplicación no contiene un manifiesto ensamblador con un Nivel de ejecución solicitado.

Fondo

Todas las aplicaciones de Windows escritas correctamente deben tener un manifiesto de ensamblaje.Y a partir de 2006 uno de los elementos que debes tener es un Nivel de ejecución solicitado que especifica si su aplicación solo puede funcionar si el usuario es administrador.

Si su aplicación no tiene un manifiesto de ensamblado, o si no tiene un Nivel de ejecución solicitado Windows asumirá que es un legado aplicación y hacer cosas para, con suerte, mantenerla funcionando.

Una cuestión de compatibilidad con las aplicaciones heredadas es que algunas de ellas pueden ser un instalador o un actualizador y solo pueden funcionar cuando se ejecutan como administrador.Windows intenta adivinar estas aplicaciones por sus nombres de archivo:

  • configuración
  • actualizar
  • parche

¿Están todos los ejemplos de nombres de archivos capturados por heurísticas de compatibilidad que intentan elevar automáticamente para el usuario.

Si la aplicación no tiene un manifiesto de ensamblado, entonces no es una aplicación de Windows escrita válidamente.

La solución correcta

La solución correcta es agregar el manifiesto ensamblador que tendrán todas las aplicaciones correctas.Esto deshabilitó la heurística.

Un ejemplo de manifiesto 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> 

En mi caso tuve que escribir un programa envoltorio que hace lo siguiente:

1-Copiar archivo "patch.exe" en la carpeta del sistema de temperatura (% TMP%) con otro nombre: "apply.exe"

2-Ejecutar "% TMP% \ apply.exe" con los argumentos deseados.

3-Delete "% TMP% \ apply.exe" archivo

Usted no tendrá que escribir un manifiesto.

Si es necesario calcular el "patch.exe" ruta completa, suponiendo que el .exe está en la variable de entorno% PATH%, puede utilizar el siguiente código en 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;
}

De lo contrario, se puede pasar la ruta completa patch.exe a su programa envoltorio si no desea añadir una nueva entrada a la variable% PATH% de su ubicación patch.exe.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top