9
votes

Pourquoi mon application C # peut-elle créer des fichiers dans Windows 7?

J'ai une application C # qui crée un fichier de paramètres pour lui-même pour stocker l'état actuel de certains éléments visuels. Cette application fonctionne simplement bien sur n'importe quelle machine qui ne tourne pas Windows 7, mais sur ces machines, nous obtenons une erreur que le fichier de paramètres ne peut pas être créé car l'utilisateur n'a pas la permission. Maintenant, je pouvais résoudre ce problème en allant à chaque ordinateur, vous connectant en tant qu'administrateur et en donnant l'accès à l'utilisateur et en écriture sur le dossier de programme de l'application que nous avons installée, mais il doit y avoir une meilleure façon.

Cela semble être dans XP, vous avez un accès en écriture sur les dossiers que vous avez créés par défaut, mais ce n'est plus le cas. Y a-t-il un paramètre dont j'ai besoin dans le paquet de configuration pour faire ce travail?


2 commentaires

Avez-vous vérifié que votre package d'installation marque le répertoire des paramètres enrichi et l'attribuant à l'utilisateur droit?


Vous ne dites pas où vous créez des fichiers, ce qui pourrait être des informations utiles


8 Réponses :


7
votes

essayez-vous de créer des fichiers dans le dossier d'installation? Vous devez utiliser le dossier de données utilisateur pour les données et non les dossiers d'installation. Utilisez le dossier Environment.SPECIALFLDIDS.ApplicationData pour obtenir un dossier que vous pouvez écrire à.


0 commentaires

19
votes

Le point est que vous ne devriez pas stocker les fichiers de paramètres dans le dossier de programme. Microsoft a informé cela pendant une longue période, mais a commencé à rendre les choses plus strictes avec Vista IIRC.

Utilisez Environnement.Specialfolders.ApplicationData (etc) pour trouver le lieu le plus approprié pour mettre les paramètres. Ou utilisez l'infrastructure de paramètres .NET qui le fait automatiquement pour vous.


1 commentaires

Merci, je savais que je faisais quelque chose de fondamentalement faux. Je stocke des données dans le dossier de programme depuis des années et je suis juste une force d'habitude. J'ai changé de création de mon propre dossier dans les données d'application et que tout fonctionne bien.



4
votes

Vous courez probablement en tant qu'administrateur sur votre machine non-Windows 7 qui écrit n'importe où. Assurez-vous de sauvegarder toutes les données d'instance utilisateur dans leur dossier Appdata (itinérance si elle devrait les suivre d'un ordinateur à un ordinateur ou local si son cache ou local à la machine TAHT uniquement). Si vous devez partager les paramètres entre les utilisateurs, utilisez le dossier C: \ programdata avec les autorisations appropriées.

Un programme ne devrait pas essayer de stocker les paramètres dans son répertoire d'installation.

Assurez-vous d'utiliser Environnement.GetFolderPath Pour obtenir les bons emplacements nécessaires. Vous ne devriez jamais faire des chemins de code difficiles, car ils peuvent être différents entre versions et langues. (Je sais dans la version allemande de XP, il n'était pas fichiers de programme mais programme !)


0 commentaires

2
votes

Il s'agit d'une faille de sécurité dans votre programme car votre programme écrit des informations sur le répertoire de programme (qui est et devrait être protégée.) Si c'est une situation de correction de la cause fondamentale, envisagez d'utiliser le Enumération SPECIALER ou les membres statiques sur Application aime comme CommonAppDataPath Pour écrire vos informations à un endroit plus approprié.

Assumer l'approche typique de l'écriture d'un fichier via un chemin, il s'agit d'une solution triviale et il n'ya pas de bonne raison de "opportunité" de ne pas corriger la cause première. Si vous n'êtes pas sûr de savoir comment manipuler le chemin, envisagez d'utiliser chemin.combine () . Il le fait pour vous.


0 commentaires

2
votes

En général, vous ne devriez pas écrire des données de programme dans n'importe quel dossier sous les fichiers de programme (même si vous avez créé le dossier). Vous devez utiliser Environnement.GetFolderPath (...) pour déterminer où mettre vos données spécifiques à votre application. Vous pouvez passer dans l'une des nombreuses Enums définies ici - Vous voulez probablement enviontment.specialfolder.commonapplicationData


0 commentaires

3
votes

Cette application fonctionne très bien sur n'importe quelle machine qui ne tourne pas Windows 7

faux! Cela ne fonctionne que sur ces machines si vous exécutez l'administrateur . Je pense que votre programme sera également cassé sur Windows XP si vous essayez de l'exécuter sur n'importe quel ordinateur d'entreprise plutôt qu'à un ordinateur à domicile.

Au lieu de cela, ce type d'information doit aller dans l'un des dossiers de données d'application spéciaux.


0 commentaires

2
votes
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

0 commentaires

-1
votes

Je ne vois pas comment tout est une réponse aculman. Je dois pouvoir écrire un rapport et avoir enregistré le dossier Documents de l'utilisateur le même dossier que j'ai utilisé pour lire les fichiers XML que je répète le rapport de.


1 commentaires

Alors tu as écrit une réponse juste pour dire ça? Veuillez utiliser des commentaires ou poser une nouvelle question (oui, vous ne pouvez toujours pas accéder aux commentaires, vous devrez fournir des réponses réelles ou poser d'abord de bonnes questions afin de gagner un représentant)