Privilèges/propriétaire problème lors de l'écriture dans C:\ProgramData\
Comme l'a souligné dans L'écriture dans le fichier de config C:\Program Files (x86)\MyApp\myapp.cfg, contre des privilèges d'Administrateur, il est pas une bonne idée d'écrire un fichier de config dans C:\Program Files (x86)\MyApp\myapp.cfg
.
Au lieu de cela, mon logiciel enregistre ses données dans un sous répertoire de %ALLUSERSPROFILE%
(ex : C:\ProgramData\MyApp\myapp.cfg
sur Win7)
[J'utilise myfile = open(filename, 'a')
en Python pour ce faire.]
Maintenant, je rencontre un problème sur ce fichier :
- J'ai installé le logiciel avec
User A
, et il a couru, puis le fichierC:\ProgramData\MyApp\myapp.cfg
a été écrit. - Puis, j'ai changé d'utilisateur pour
User B
, et a couru de nouveau mon logiciel : maintenant, une erreur s'affiche :User 2
n'a pas le droit d'écrire dansC:\ProgramData\MyApp\myapp.cfg
(Permission denied
).
Pourquoi? N'est-ce pas %ALLUSERSPROFILE%
un lieu qui peut être écrit par tous les utilisateurs?
Comment résoudre ce problème ?
- Réitérer l'un de David points qui peut avoir été perdu dans la discussion suivante, assurez-vous que c'est vraiment ce que vous devriez faire avant de le faire. C'est assez rare pour qu'elle ait un sens pour une application de configuration de partage de données entre utilisateurs. Habituellement, chaque utilisateur doit avoir son propre fichier de configuration. (Si Fred et George partagez un ordinateur, et Fred veut de votre application pour avoir un fond bleu, mais George veut avoir un rouge?)
Vous devez vous connecter pour publier un commentaire.
Non,
C:\ProgramData
, akaFOLDERID_ProgramData
, a limité les paramètres de sécurité. Standard, les utilisateurs peuvent créer des fichiers. Mais ces fichiers ne sont, par défaut, sécurisé, de sorte que seul l'utilisateur qui a créé le fichier peut ensuite modifier le fichier.La solution recommandée est de votre programme d'installation pour créer un sous-répertoire de
C:\ProgramData
pour le stockage partagé. Et que le sous-répertoire doit être permissif ACL par le programme d'installation. C'est ce que les subventions de l'accès souhaité à tous les utilisateurs standard.Je me demande si vous avez vraiment besoin partagé accessible en écriture de données. Normalement, je m'attends à le voir 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 tend à être par utilisateur.
InnoSetup installer
pour créer unC:\ProgramData\MySoftware
répertoire l'accès partagé par tous les utilisateurs avec autorisation de lecture/écriture (savez-vous comment faire cela? Je vais rechercher de toute façon).f = open(filename, 'a')
en Python) qui auront plein accès en lecture/écriture par tous les autres utilisateurs ?User A
crée (avecf = open(...)
) , est-il un moyen de le faire, à votre avis @DavidHeffernan ?open()
en Python pour accorder l'accès à d'autres utilisateurs. L'utilisateur qui crée le fichier propriétaire du fichier. Je n'ai pas de savoir si Python est une fonctionnalité à tous pour accorder l'accès à d'autres utilisateurs. Mais dans l'API Win32 termes, vous pouvez accorder des droits d'accès avecCreateFile()
,SetFileSecurity()
, ou deSetNamedSecurityInfo()
.CreateFile()
au moment de la création du fichier.CreateFile()
pouvez définir un descripteur de sécurité à la fois qu'un fichier est créé.SetFileSecurity()
etSetNamedSecurityInfo()
pouvez définir un descripteur de sécurité sur un fichier existant, si l'utilisateur a les droits pour modifier le fichier de sécurité (par exemple si l'utilisateur propriétaire du fichier).C:\ProgramData\MyApp
moins permissive ACL est appliquée à ce répertoire.ProgramData
permettent à l'utilisateur d'écrire pour elle; en particulier, pour créer de nouveaux fichiers et dossiers. Cependant, seul l'utilisateur qui crée un fichier donné qu'il a l'autorisation par défaut à écrire.ProgramData
sontc:\ProgramData NT AUTHORITY\SYSTEM:(OI)(CI)(F) BUILTIN\Administrators:(OI)(CI)(F) CREATOR OWNER:(OI)(CI)(IO)(F) BUILTIN\Users:(OI)(CI)(RX) BUILTIN\Users:(CI)(WD,AD,WEA,WA)
Je tiens à ajouter sur ce que j'ai eu des problèmes de l'écriture à C:\ProgramData ainsi. Mon problème a fini par être que mon répertoire/fichiers à l'intérieur C:\ProgramData ont été écrits par un administrateur. Lorsque mon application a couru sous un utilisateur normal, il était incapable d'écrire, de sorte que Windows automatiquement utilisé C:\Users\fooface\AppData\Local\VirtualStore\ProgramData au lieu de cela. J'ai trouvé le chemin qu'il a été écrit en utilisant le moniteur de processus sur ma demande. Après avoir vu ce que j'ai supprimé les fichiers de C:\ProgramData et a couru mon app de nouveau et il y a écrit que prévu.
Espère que cela aide quelqu'un.