2010-02-10 13 views
3

Contexte: Je ne suis en aucun cas un expert en sécurité Windows/utilisateurs. J'ai une application (écrite en C#), qui doit pouvoir écrire/supprimer des dossiers & dossiers dans son répertoire racine, écrire/supprimer des fichiers ailleurs sur le disque, écrire/modifier les valeurs dans le registre système (machine locale) et commencer & arrêter d'autres applications et services. Je suppose que j'ai besoin de privilèges d'administrateur pour au moins certaines de ces actions.Installez le programme qui doit être exécuté en tant qu'administrateur

J'ai essayé d'exécuter ceci et sur des ordinateurs avec l'UAC éteint cela fonctionne très bien sans réglages supplémentaires. Cependant, sur les ordinateurs avec UAC activé (tout niveau au-dessus de "not notify" dans Windows 7), il va planter. J'en ai besoin pour travailler sur tous les ordinateurs. Jusqu'à présent, je vérifiais manuellement la case à cocher «Exécuter ce programme en tant qu'administrateur» et tout allait bien se passer. Cependant, nous avons maintenant décidé que nous autoriserons les clients à installer ce logiciel par eux-mêmes, et qu'il doit fonctionner «prêt à l'emploi».

J'ai un projet de déploiement dans Visual Studio 2008 qui installe tout et écrit les données de démarrage nécessaires dans le registre. Ce que je dois faire maintenant est de mettre le drapeau "Exécuter ce programme en tant qu'administrateur". Je suppose que ce n'est pas aussi simple que je le voudrais.

Alors Quelle est la bonne façon de faire cela? Ce programme est démarré au démarrage, et ce serait énervant pour nos clients si UAC apparaissait (et éventuellement assombrit l'écran) chaque fois qu'ils redémarrent leur ordinateur.

Nous vous remercions de votre aide.

EDIT: Nous vous remercions de vos réponses. Je me rends compte que travailler autour de l'UAC serait mal vu, et je peux voir que Microsoft ne supporte pas les "listes blanches" donc il ne demanderait la permission qu'une seule fois. C'est bien je peux respecter cela, mais j'ai quelques questions de suivi:

  • Pouvez-vous me fournir un lien qui me montrer comment élever correctement le programme pour corriger l'état élevé? Existe-t-il de la littérature sur les options, etc ... Au fond, j'aimerais un guide UAC 101.

  • Existe-t-il un moyen d'élever l'état de sécurité lorsque j'ai besoin des privilèges supplémentaires (et seulement alors l'invite avec UAC). Fondamentalement, ces applications fonctionnent en arrière-plan, ne faisant presque rien pour la plupart du temps. De temps en temps, il va vérifier certains fichiers (à ce stade, je vais avoir besoin d'être en mesure d'écrire sur le disque et lire le registre (en lecture seule est très bien à ce stade), mais comme il est un dossier temporaire, Si il ya un endroit où l'application peut écrire sans aucun privilège qui serait parfait.)

    Cependant, à un moment donné, je devrai effectuer toutes les autres tâches (l'utilisateur doit confirmer cette action) de toute façon) donc si UAC invitait à ce stade ce ne serait pas un problème. Existe-t-il un moyen de l'élever juste à ce stade, puis de le renvoyer aux autorisations par défaut? Une telle solution fonctionnera-t-elle avec les anciennes versions de Windows, y compris Vista et Xp (et peut-être plus vieux?) Que faudrait-il pour que cela fonctionne?

+0

voir ceci (duplicata possible?) Question: http://stackoverflow.com/questions/2019743/can-we-get-the-uac-prompt-to-show-only-once – hawbsl

Répondre

3

La bonne façon est d'élever lorsque le programme démarre, avec l'invite UAC (que vous pouvez définir via le manifeste du programme) - en essayant d'être intelligent et le contourner est désapprouvée.Pensez-y - si vous pouviez installer quelque chose qui s'élèverait automatiquement sans l'invite UAC ... quel serait le but de l'UAC?

Pour ajouter un manifeste UAC à un programme, il suffit d'ajouter le manifeste dans un projet et de le modifier. Un exemple de manifeste pour UAC est here. Si vous voulez vous élever au dernier moment possible, vous avez besoin d'un processus distinct - vous ne pouvez pas élever un processus existant. Donc, séparez ce bit et démarrez-le en utilisant

Process.StartInfo.UseShellExecute = true; 
Process.StartInfo.Verb = "runas"; 
+0

Oui, je peux le voir. Ce que j'aimerais vraiment, c'est inviter UAC une seule fois (la première fois que le programme est exécuté? Eventuellement pendant ou juste après l'installation). –

+1

Pouvez-vous fournir un lien vers une procédure pas à pas sur la façon d'élever correctement le programme? Je vous remercie. –

+0

Mais vous manquez le point de UAC si vous pensez que ce devrait être une seule fois une invite. Ça ne marche pas comme ça, il est censé apparaître avant chaque fois que les privilèges sont nécessaires. C'est la façon «appropriée» d'élever. Pour ce faire, faites un clic droit sur votre projet dans VS2008 et ajoutez un fichier manifeste, puis modifiez l'option UAC dans le manifeste, selon le cas. – blowdart

0

Vous devez repenser le fonctionnement de votre application. Vous avez raison de dire qu'il serait ennuyeux d'afficher une invite d'élévation lors de la connexion. Alors ne le fais pas. D'un autre côté, vous pouvez avoir des tâches que vous devez effectuer en utilisant un accès administratif.

Alors vous avez deux choix:

  • modifier vos tâches afin qu'ils ne nécessitent plus d'élévation administrative (par exemple, écrire vos fichiers ailleurs).
  • Brisez votre application dans un composant de service Windows et un composant d'interface utilisateur. Le composant de service peut s'exécuter sous un compte élevé (j'espère que le compte moins nécessaire pour effectuer les tâches que vous devez faire). Le composant de l'interface utilisateur peut parler au service (via des canaux nommés ou similaires) si nécessaire.
0

Vous pouvez diviser votre programme en deux composantes:

  • une application utilisateur en cours d'exécution sans élévation
  • un service Windows qui est responsable des tâches qui nécessitent l'élévation

Puisque vous En utilisant. NET, la communication entre les composants est probablement la plus facile à faire en utilisant WCF.

Et en remarque: La modification par programme de fichiers sous C: \ Program Files n'est pas considérée comme une bonne pratique et peut entraîner un certain nombre d'autres problèmes. Windows a des emplacements dédiés pour stocker les paramètres de configuration et d'autres données de programme.

Questions connexes