arrière-plan: b> le problème b> Dans les cas où il s'agissait d'un problème avec les droits des utilisateurs du programme, chaque utilisateur pourrait accéder à l'emplacement exact du fichier sur le Web, de le télécharger, puis de l'enregistrer sur le bon endroit manuellement. P>
Je veux que cela fonctionne comme tous les autres programmes que j'ai vue Télécharger / Installer dans cette Fassion (I.E. Firefox PLUIGE Mises à jour, Flash Player, Java, Adobe Reader, etc.). Tous ces travaux sans attelage. P>
la question b> Toute aide ici est appréciée. Je souhaite essayer de rester à l'écart des applications / bibliothèques tierces si possible, autres que Microsoft, bien sûr, en raison de problèmes de licence, mais envoyez toujours des suggestions de ma manière. P>
Encore une fois, d'autres programmes semblent avoir les problèmes de droits et la capacité de téléchargement figurant. Je veux cette même capacité. P>
J'ai une application principale qui doit être capable d'accéder au Web et de télécharger des fichiers DLL associés à celui-ci (ceux que nous écrivons, situés sur notre serveur). Il doit vraiment pouvoir télécharger ces fichiers DLL dans le dossier d'application dans "C: \ Program Files \". Dans le passé, j'ai utilisé system.net.webclient code> pour télécharger les fichiers que je voulais sur le Web. P>
J'ai eu beaucoup de difficulté à télécharger des données dans le passé et à enregistrer les fichiers sur le disque dur d'un utilisateur. Je reçois de nombreux rapports d'utilisateurs disant que cela ne fonctionne pas et il est généralement en raison des problèmes de droits des utilisateurs dans le programme. p>
Y a-t-il du code que je dois utiliser pour donner à mon programme de télécharger les droits spéciaux sur le dossier de fichiers de programme? Puis-je même faire ça? Y a-t-il une meilleure classe ou une meilleure bibliothèque que je devrais utiliser? Existe-t-il une approche différente de télécharger des fichiers que je devrais prendre, telles que l'utilisation de threads ou quelque chose d'autre pour télécharger des données? P>
6 Réponses :
Écrire dans le répertoire de fichiers de programme nécessite une élévation de l'UAC (si l'utilisateur l'a activé) sur Vista / Win7. Voir cet exemple de code sur la manière d'inviter les utilisateurs à la permission: http://msdn.microsoft .com / fr-US / bibliothèque / aa970890.aspx P>
Vraiment, pensez à concevoir votre application afin qu'il écrive à un endroit plus approprié où cela ne risque pas d'écraser accidentellement un fichier de programme critique. P>
Où les programmes comme Adobe Reader et Java installent-ils leurs fichiers? Je pensais qu'ils ont téléchargé et ont installé leurs fichiers sur leurs dossiers dans "Fichiers de programme".
Ah, désolé je pensais que vous téléchargiez des documents. Pour télécharger des DLL pour votre propre application, les fichiers de programme ont du sens
La leçon importante ici est de faire votre développement (ou au moins vos tests) à partir d'un compte non-administrateur avec UAC entièrement activé.
Un autre endroit que vous pourriez télécharger des DLL pour constituerait un sous-dossier de% AppData%. Toutefois, les informations spécifiques à votre profil utilisateur.
Que diriez-vous d'essayer http://netsparkle.codeplex.com/ . Un port de la très réussie Mac Sparkle Framework http://sparkle.andymatuschak.org/ . P>
Vérifiez le service BITS: P>
Ne le faites pas. P>
théoriquement, cela peut être fait facilement. Vous déjeunerez juste une autre application, qui fonctionne avec des privilèges administratifs - vous pouvez les demander en configuration. Dans l'application Updater, vous vous connectez simplement à un site Web sécurisé (SSL), téléchargez tout ce dont vous avez besoin, les fichiers que vous téléchargez Ceci peut également être facilement résolu à l'aide de ClickOnce ou d'un autre programme d'installation Web, capable de mises à jour. P>
Ce que vous ne devriez pas faire est de télécharger simplement de la DLL insécurité d'une source non vérifiée et de les exécuter. P>
a-t-il vraiment besoin d'être dans les fichiers de programme? J'ai eu un problème similaire dans une application et nous avons écrit une classe pour résoudre les assemblées non installés en essayant d'abord de les charger d'un sous-dossier du% des utilisateursProfile%, puis en essayant de télécharger. Cela peut être transparent si vous vous ajoutez de la méthode de résolution de l'événement AssemblyResolve de domaine de l'application actuel.
AppDomain.CurrentDomain.AssemblyResolve+= AssemblyResolve; public Assembly AssemblyResolve(object sender, ResolveEventArgs args) { //try to get locally //try to download return assembly; }
La façon habituelle de faire cela va comme ceci: p>
code>. Cette demande de mise à jour doit fonctionner avec des droits d'administration (c'est-à-dire une invite pour l'élévation de l'UAC dans Vista / Win7). Le moyen le plus simple de s'assurer qu'il s'agit de Ajoutez un manifeste d'application à cette application de mise à jour . LI>
ol>
Si l'utilisateur est un administrateur avec UAC activé, le point 2 provoquera l'apparition d'une invite de l'UAC qui doit être acceptée (note que la même chose est vraie pour Firefox / Acrobat / etc. Updateurs). Si l'utilisateur n'est pas un administrateur, il sera demandé aux informations d'identification de l'administrateur. (Notez que c'est une bonne chose: seul un administrateur doit être autorisé à mettre à niveau les applications installées pour tous les utilisateurs.) P>
Votre application de mise à jour n'a pas besoin d'être écrite de manière particulière: il peut utiliser system.net.webclient code> comme avant. Le manifeste d'application garantira qu'il demande aux prémissions requises pour écrire sur Fichiers de programme CODE>. P>
Notez que ce problème ( fichiers de programme code> ne pas être écritable par des administrateurs sans élévation de l'UAC) est une fonctionnalité de système d'exploitation et non une limitation de langage de programmation, de sorte que vous ne résoudrez pas ce problème simplement en "utilisant une bibliothèque différente ". Si vous souhaitez que votre application fonctionne sur Vista / Win7 et écrivez sur Fichiers de programme CODE>, vous em> Besoin d'une élévation de l'UAC. P>
+1 pour "est une fonctionnalité de système d'exploitation et non une limitation de langue programmante"
J'ai beaucoup ressemblé à ceci et c'est la méthode la meilleure et la plus largement utilisée.
Ouais ... C'est une bonne question. Sur un Mac, j'utiliserais Sparkle sparkle.andymatuschak.org mais je suis curieux de voir s'il y a quelque chose comme ça développé pour .NET.
Cliquez une fois la voie à suivre dans ce cas. Il est littéralement cliquez une fois. Chaque fois que votre application commence, il vérifiera votre serveur pour voir s'il existe une mise à jour et mettra automatiquement à jour l'application ou les fichiers.
@Shiv: ClickOnce n'installe pas dans les fichiers de programme code>, c'est-à-dire, il n'instalte que l'application pour l'utilisateur actuel.