56 votes

Autoriser l'accès en écriture dans Program Files de Windows 7

Mon application génère des erreurs "Accès refusé" lors de l'écriture de fichiers temporaires dans le répertoire d'installation où se trouve l'exécutable. Pourtant, elle fonctionne parfaitement bien sous Windows XP. Comment donner des droits d'accès au répertoire Program Files dans Windows 7 ?

EDIT : Comment faire pour que le programme demande à l'utilisateur d'élever ses droits ? (c'est-à-dire lancer le programme avec des droits d'administrateur complets)

6 votes

Il ne fonctionne que sous XP si vous ne l'avez pas testé correctement (installé en tant qu'administrateur, utilisé par des utilisateurs standard). Ce genre de choses est déconseillé depuis de nombreuses années, vous devriez corriger votre application au lieu de la pirater.

2 votes

Vous voulez dire que c'est parce que je fais du codage de mauvaise qualité ? Si c'est le cas, veuillez m'expliquer pour que je puisse m'améliorer.

3 votes

Gergo Dries donne la réponse correcte ci-dessous. Votre programme a-t-il réellement besoin d'une élévation de privilèges ? Ou essayez-vous d'élever les privilèges pour prendre en charge une pratique déconseillée (par exemple, l'écriture de fichiers temporaires dans un répertoire auquel les fichiers temporaires n'appartiennent pas) ?

94voto

Gerco Dries Points 4319

Votre programme ne doit pas écrire de fichiers temporaires (ni rien d'autre d'ailleurs) dans le répertoire du programme. Tout programme doit utiliser %TEMP% pour les fichiers temporaires et %APPDATA% pour les données d'application spécifiques à l'utilisateur. Ceci est vrai depuis Windows 2000/XP et vous devriez donc modifier votre application.

Le problème n'est pas Windows 7.

Vous pouvez demander le chemin du dossier appdata :

string dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

ou pour le chemin TEMP

string dir = Path.GetTempPath()

4 votes

100% correct ! Plus d'informations ici : social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/

8 votes

Le problème avec cette réponse est qu'il ne s'agit pas d'une réponse du tout, est-ce que Windows connaît la signification de la "rétrocompatibilité" ? Si vous avez créé une application qui fonctionnait bien sous Windows XP, pourquoi va-t-elle se planter ou même nécessiter de nouvelles permissions spécifiques pour fonctionner sur les nouveaux systèmes, il est fou d'essayer de penser à des "peut-être" sur votre application au cas où MS déciderait qu'ils restreignent X ou Y maintenant et que votre application repose sur cela. Au lieu de cela, MS devrait dire "ok, les fichiers de votre programme fonctionneront comme ils le font actuellement, mais voici le dossier NewProgramFiles qui vous aidera à, bla bla bla".

9 votes

Sa questition était how to provide access rights . Votre réponse dit en gros : " don't ". Toutefois, cela ne répond pas à sa question initiale.

29voto

Joseph Points 18099

Votre programme doit être exécuté avec des droits administratifs. Vous ne pouvez pas le faire automatiquement avec le code, mais vous pouvez demander à l'utilisateur (dans le code) d'élever les droits de votre programme pendant son exécution. Il existe un wiki sur la manière de le faire. Vous pouvez également exécuter n'importe quel programme en tant qu'administrateur en cliquant avec le bouton droit de la souris sur son icône et en cliquant sur "Exécuter en tant qu'administrateur".

Cependant, je ne vous conseille pas de le faire. Il serait préférable d'utiliser quelque chose comme ceci :

Environment.GetFolderPath(SpecialFolder.ApplicationData);

pour obtenir le chemin du dossier AppData et y créer un dossier pour votre application. Mettez-y ensuite les fichiers temporaires.

0 votes

@n0vic3c0d3r J'ai ajouté une référence wiki pour vous. J'espère que cela vous aidera !

0 votes

En cas d'erreur, ajoutez Enviroment : Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

11voto

crashmstr Points 15302

Les options auxquelles je pense :

  • Exécuter toute l'application en tant qu'administrateur complet en utilisant l'UAC.
  • Exécutez un sous-processus en tant qu'administrateur complet pour les seules choses auxquelles vous devez accéder.
  • Écrire les fichiers temporaires ailleurs

8voto

taimoor1990 Points 11

Ajouter un nouvel élément dans le projet : Application Manifest et enregistrez-le.

Maintenant, ouvrez ce fichier et cherchez <requestExecutionLevel> . Il doit être réglé sur asInvoker .

Changez-le en highestAvailable . Lors de l'exécution de votre application, une demande d'autorisation apparaîtra. Cliquez sur yes !

C'est tout :) maintenant vous pouvez écrire et lire depuis le system32 ou n'importe quel autre fichier qui nécessite le droit d'administrateur.

Vous pouvez vérifier votre demande en sigcheck .

sigcheck.exe -m yourapp.exe

Et dans la sortie, vérifiez l'élément requestedExecutionLevel.

0 votes

Je ne suis pas sûr, il m'a fallu quelques années pour répondre, désolé pour cela :)

0 votes

Upvote parce que c'est la réponse. Parce que si l'application dont la personne parle pourrait être un installateur qui a besoin d'écrire dans des fichiers de programme ?

0 votes

C'est exactement ce que j'ai pensé :)

4voto

Christopher Points 5252

Vous ne pouvez pas demander à une application .Net d'élever ses propres droits. Cela n'est tout simplement pas autorisé. Le mieux que vous puissiez faire est de spécifier des droits élevés lorsque vous lancez un autre processus. Dans ce cas, l'application est lancée en deux étapes.

L'étape 1 ne fait rien d'autre que de préparer un spawn élevé en utilisant l'objet System.Diagnostics.ProcessStartInfo et l'appel Start().

L'étape 2 est l'application fonctionnant dans un état élevé.

Comme indiqué plus haut, il est cependant très rare que vous souhaitiez procéder ainsi. Et vous ne voulez certainement pas le faire juste pour pouvoir écrire des fichiers temporaires dans %programfiles%. N'utilisez cette méthode que lorsque vous devez effectuer des actions administratives telles que le démarrage ou l'arrêt de services, etc. Inscrivez vos fichiers temporaires à un meilleur endroit, comme indiqué dans d'autres réponses ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X