web-dev-qa-db-fra.com

Problème de privilèges / propriétaire lors de l'écriture dans C: \ ProgramData \

Comme indiqué dans Écriture du fichier de configuration dans C:\Program Files (x86)\MyApp\myapp.cfg, par rapport au privilège administrateur , ce n'est pas une bonne idée d'écrire un fichier de configuration dans C:\Program Files (x86)\MyApp\myapp.cfg.

Au lieu de cela, mon logiciel enregistre maintenant ses données dans un sous-répertoire de %ALLUSERSPROFILE% (Ex: C:\ProgramData\MyApp\myapp.cfg Sur Win7)

[J'utilise myfile = open(filename, 'a') dans Python pour ce faire.]

Je rencontre maintenant un problème avec ce fichier:

  • J'ai installé le logiciel avec User A Et l'ai exécuté, puis le fichier C:\ProgramData\MyApp\myapp.cfg A été écrit.
  • Ensuite, j'ai changé d'utilisateur en User B, Et j'ai de nouveau exécuté mon logiciel: maintenant une erreur s'affiche: User 2 N'a pas le droit d'écrire C:\ProgramData\MyApp\myapp.cfg (Permission denied ).

Pourquoi? %ALLUSERSPROFILE% N'est-il pas un endroit qui peut être écrit par tous les utilisateurs? Comment résoudre ce problème?

35
Basj

Non, C:\ProgramData, alias FOLDERID_ProgramData, a des paramètres de sécurité restreints. Les utilisateurs standard peuvent y créer des fichiers. Mais ces fichiers sont, par défaut, sécurisés afin que seul l'utilisateur qui a créé le fichier puisse le modifier ultérieurement.

La solution recommandée consiste pour votre installateur à créer un sous-répertoire de C:\ProgramData pour votre stockage partagé. Et ce sous-répertoire doit recevoir une ACL permissive par le programme d'installation. C'est ce qui accorde l'accès souhaité à tous les utilisateurs standard.

Je me demande si vous avez vraiment besoin de données partagées accessibles en écriture. Normalement, je m'attendrais à voir la configuration partagée être quelque chose qui est spécifié au moment de l'installation et modifié rarement par les administrateurs. La plupart des données de configuration ont tendance à être par utilisateur.

34
David Heffernan

Je voudrais ajouter à cela, car j'avais également des problèmes d'écriture dans C:\ProgramData. Mon problème a fini par être que mon répertoire/fichiers dans C:\ProgramData ont été écrits par un administrateur. Lorsque mon application s'exécutait sous un utilisateur normal, elle ne pouvait pas y écrire, donc Windows utilisait automatiquement C:\Users\fooface\AppData\Local\VirtualStore\ProgramData à la place. J'ai trouvé le chemin vers lequel il écrivait en utilisant Process Monitor sur mon application. Après avoir vu cela, j'ai supprimé les fichiers de C:\ProgramData et exécuté à nouveau mon application et elle y a écrit comme prévu.

J'espère que cela aide quelqu'un.

0
Daniel Caban