2009-11-11 18 views
5

mi aplicación incluye un ejecutable de autoactualización que se utiliza para actualizar la aplicación.Acceso de escritura a la carpeta Archivos de programa

Uno de los primeros pasos del proceso de actualización está realizando es para comprobar que tiene permiso de escritura en la carpeta de aplicación

IPermission perm = new FileIOPermission(FileIOPermissionAccess.AllAccess, _localApplicationCodebase);

 if (!SecurityManager.IsGranted(perm)) 
     { 
      OnProgressChanged("Security Permission Not Granted \n The updater does not have read/write access to the application's files (" + 
           _localApplicationCodebase + ")",MessageTypes.Error); 
      return false; 
     } 

     OnProgressChanged("Updater have read/write access to local application files at " + _localApplicationCodebase); 
     return true; 

Cuando se ejecutan con el Win7/Vista, este paso de código (es decir, que de acuerdo con la CAS, el código tiene acceso de escritura), sin embargo, cuando intento escribir archivos, recibí un acceso denegado (y confirmé que los archivos NO están en uso)

Entiendo que Vista/Win7 UAC impide a los usuarios escribiendo archivos en las carpetas de archivos de programa. Sin embargo, lo que no entiendo es por qué se le concede el permiso si en realidad no lo es

Saludos,

Eric Girard

PD: Si me quedo utilizando el mismo código 'Ejecutar como administrador' , funciona bien

+0

es la aplicación que intenta sobrescribir sí mientras se está ejecutando? –

+0

Como escribí, no, no lo es, el actualizador es otro .exe que no depende de ninguna DLL local –

+0

Creo que si no eres un administrador, entonces no puedes escribir ningún archivo ejecutable en ningún archivo de programa subcarpeta. ¿Tu actualizador intenta escribir ejecutables? –

Respuesta

4

La mejor manera de escribir un actualizador automático es tener una aplicación secundaria. El primer programa llama al segundo con privilegios elevados, lo que provoca UAC. Luego, la segunda aplicación puede instalar los parches.

+0

O haga que la aplicación se vuelva a llamar con privilegios elevados. Si no tiene esos privilegios, debería ejecutarse de nuevo, lo que hace que el UAC tenga más derechos ... –

+0

Eso es exactamente lo que estoy haciendo en este momento, pero eso aún no responde mi pregunta: ¿por qué es SecurityManager? IsGranted devuelve TRUE para esta carpeta si en realidad no se concede para la carpeta de archivos del programa? –

4

Lo importante saber acerca de UAC es que, por defecto, ningún código se ejecuta con privilegios de administrador y por lo tanto no se puede escribir en el directorio Archivos de programa. Incluso si ha iniciado sesión como administrador, las aplicaciones se inician con los privilegios de usuario estándar.

Hay dos formas de evitar esto. Puede hacer que el usuario inicie la aplicación con la opción de menú Ejecutar como administrador. Pero esto depende del usuario para recordar algo. Lo mejor era embed a manifest en su archivo ejecutable que solicita privilegios de administrador. En el manifiesto, establezca requiredExecutionLevel en requireAdministrator. Esto hará que UAC solicite al usuario las credenciales de administrador tan pronto como se inicie la aplicación.

Como dijo Daniel, la mejor solución es poner la funcionalidad de actualización en una aplicación separada. Su aplicación principal tendrá un manifiesto que establece requiredExecutionLevel como "asInvoker" y su aplicación de actualización con la solicitud "requireAdministrator". Tu aplicación principal se puede ejecutar con privilegios estándar. Pero cuando deba realizarse la actualización, use Process.Start para iniciar la aplicación de actualización que requiere que el usuario ingrese las credenciales de administrador.

1

No estoy seguro de si esto es lo que intenta hacer, pero encuentro útil esta publicación. El código incluido le permite detectar si su aplicación se está ejecutando en Vista, si UAC está habilitado y si el usuario está elevado.

http://www.itwriting.com/blog/198-c-code-to-detect-uac-elevation-on-vista.html

continuación, reinicie su aplicación con runas para que los permisos de usuario Elevate

ProcessStartInfo processInfo = new ProcessStartInfo(); 
processInfo.Verb = "runas"; 
processInfo.FileName = Application.ExecutablePath; 
Process.Start(processInfo); 
Cuestiones relacionadas