2010-10-13 6 views
6

J'ai créé un programme dans Visual Studio. Le programme crée un fichier journal et écrit dedans pendant que le programme est en cours d'exécution. Par conséquent j'ai construit un installateur (setup-project), qui devrait établir des autorisations d'écriture pour mon dossier de programme indépendamment de l'utilisateur qui travaille avec le programme. actuellement, il ressemble à ceci:Définir les autorisations d'écriture pour tous les utilisateurs de mon dossier de programme

// ... 
} 
    InitializeComponent(); 

    string folder = Directory.GetCurrentDirectory(); 

    DirectorySecurity ds = Directory.GetAccessControl(folder); 
    ds.AddAccessRule(new FileSystemAccessRule("Everyone", //Everyone is important 
                //because rights for all users! 
    FileSystemRights.Read | FileSystemRights.Write, AccessControlType.Allow)); 
} 
// ... 

Au cours des deux dernières lignes, je reçois un System.SystemException: « Die Vertrauensstellung zwischen der primären Domäne und der vertrauenswürdigen Domäne konnte nicht hergestellt werden. »

[Traduction: « La relation de confiance entre le domaine principal et le domaine approuvé ne pouvait pas être établie »]

le stacktrace se lit comme suit:.

bei System.Security.Principal.NTAccount.TranslateToSids(IdentityReferenceCollection sourceAccounts, Boolean& someFailed) 
bei System.Security.Principal.NTAccount.Translate(IdentityReferenceCollection sourceAccounts, Type targetType, Boolean& someFailed) 
bei System.Security.Principal.NTAccount.Translate(IdentityReferenceCollection sourceAccounts, Type targetType, Boolean forceSuccess) 
bei System.Security.Principal.NTAccount.Translate(Type targetType) 
bei System.Security.AccessControl.CommonObjectSecurity.ModifyAccess(AccessControlModification modification, AccessRule rule, Boolean& modified) 
bei System.Security.AccessControl.CommonObjectSecurity.AddAccessRule(AccessRule rule) 
bei System.Security.AccessControl.FileSystemSecurity.AddAccessRule(FileSystemAccessRule rule) 

Avez-vous une idée de ce que je peux faire? merci

+4

Avez-vous exécuté votre programme d'installation avec des privilèges administratifs? – Dennis

+3

Notez qu'il ya une raison pour les différents dossiers publics sur un système donné pour stocker des données de programme ... – NotMe

+0

Oh, je pensais exécuter l'installateur avec des privilèges administratifs est un paramètre par défaut. Où puis-je chercher ceci? Dans les propriétés de mon projet d'installation, je ne peux pas trouver cela. – Rotaney

Répondre

3

Peut-être que la meilleure réponse n'est pas ce que vous avez demandé. Il y a une bonne raison pour ne pas écrire dans le répertoire des fichiers du programme. Les données du journal en particulier sont transitoires et ne doivent pas être écrites ici.

Il est préférable d'écrire des données de journal dans le répertoire spécifié par la variable d'environnement TEMP. Si vous faites cela, vous épargnerez quelques problèmes à vos utilisateurs et les empêcherez de maudire votre logiciel à l'avenir. S'il vous plaît vérifier cette réponse qui couvre le même sujet: vous devez mentionner

Allow access permission to write in Program Files of Windows 7

0

Ce previously asked question dans la bonne direction. Fondamentalement, vous faites pas veulent n'importe quel utilisateur écrivant dans le dossier Program Files. L'UAC, la sécurité et d'autres mesures sont là pour essayer de prévenir autant que possible. Essentiellement, si vous voulez un seul fichier qui sera écrit par tous les utilisateurs, vous le voulez dans le dossier ProgramData, accessible par le %ALLUSERSPROFILE%, plutôt que le dossier temporaire des utilisateurs individuels, ce qui est certainement ce que vous voulez à faire avec un fichier journal. N'oubliez pas que le contenu du dossier temporaire doit être considéré comme volatile et peut être supprimé à tout moment, par exemple par l'Assistant Nettoyage de disque.

3

L'instruction dans laquelle vous réglez réellement le contrôle d'accès sur le répertoire ne vous manque-t-elle pas?

Directory.SetAccessControl(Directory.GetCurrentDirectory(), ds); 
Questions connexes