2009-11-11 4 views
5

mon application inclut un exécutable de mise à jour automatique qui est utilisé pour mettre à jour l'application.Dossier d'accès en écriture au dossier des programmes

L'une des premières étapes de la mise à jour EFFECTUE est de vérifier qu'il ne l'autorisation d'écriture dans le dossier de l'application

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; 

Lors de l'exécution sous Win7/Vista, ce passage de code (ce qui signifie que, selon CAS, le code a un accès en écriture), mais quand j'essaye d'écrire des fichiers, j'ai reçu un accès refusé (et j'ai confirmé que les fichiers ne sont pas utilisés)

Je comprends que Vista/Win7 UAC empêche les utilisateurs de écrire des fichiers dans les dossiers de fichiers du programme. Cependant, ce que je ne comprends pas pourquoi l'autorisation est accordée si, en réalité, ce n'est pas

Cordialement,

Eric Girard

PS: Si je lance le même code en utilisant « Exécuter en tant qu'administrateur » , ça marche bien

+0

est l'application qui essaie de se remplacer pendant qu'il est en cours d'exécution? –

+0

Comme je l'ai écrit, non, le programme de mise à jour est un autre .exe que pas de dépendances sur une DLL locale –

+0

Je pense que si vous n'êtes pas un administrateur, vous n'êtes pas autorisé à écrire un fichier exécutable dans les fichiers programme sous-dossier. Votre programme de mise à jour essaie-t-il d'écrire des exécutables? –

Répondre

4

La meilleure façon d'écrire un programme de mise à jour automatique est d'avoir une application secondaire. Le premier programme appelle le second avec des privilèges élevés, ce qui incite l'UAC. Ensuite, la deuxième application peut installer les correctifs.

+0

Ou, faites l'application s'appelle à nouveau avec des privilèges élevés. Si elle ne possède pas ces privilèges, elle devrait s'exécuter à nouveau, incitant l'UAC à obtenir plus de droits ... –

+0

C'est exactement ce que je fais en ce moment, mais cela ne répond toujours pas à ma question: pourquoi SecurityManager. IsGranted retourne TRUE pour ce dossier si en réalité il n'est pas accordé pour le dossier des fichiers du programme? –

4

La chose importante à savoir à propos de l'UAC est que, par défaut, aucun code ne s'exécute avec les privilèges d'administrateur et ne peut donc pas écrire dans le répertoire Program Files. Même si vous êtes connecté en tant qu'administrateur, les applications sont lancées avec des privilèges d'utilisateur standard.

Il y a deux façons de contourner cela. Vous pouvez demander à l'utilisateur de démarrer l'application avec l'élément de menu Exécuter en tant qu'administrateur. Mais cela dépend de l'utilisateur de se souvenir de quelque chose. Le mieux était de embed a manifest dans votre exécutable qui demande des privilèges d'administrateur. Dans le manifeste, définissez requestedExecutionLevel sur requireAdministrator. Cela entraînera UAC à inviter l'utilisateur pour les informations d'identification d'administrateur dès que l'application démarre. Comme Daniel l'a dit, la meilleure solution consiste à mettre la fonctionnalité de mise à jour dans une application distincte. Votre application principale aura un manifeste qui définit requestedExecutionLevel sur "asInvoker" et votre application de mise à jour avec la demande "requireAdministrator". Votre application principale peut fonctionner avec des privilèges standard. Mais lorsque la mise à jour doit avoir lieu, utilisez Process.Start pour lancer l'application de mise à jour qui nécessite que l'utilisateur entre les informations d'identification de l'administrateur.

1

Je ne sais pas si c'est ce que vous essayez de faire, mais j'ai trouvé ce message utile. Le code inclus vous permet de détecter si votre application est en cours d'exécution sur Vista, si l'UAC est activé et si l'utilisateur est élevé.

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

puis redémarrez votre application avec runas pour laisser des autorisations Elevate utilisateur

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