2017-10-11 3 views
3

Je crée une nouvelle version d'une application de bureau Windows existante qui fonctionne correctement depuis plusieurs années. L'application utilise une base de données SqlServerCe, qui est installée dans le répertoire DataDirectory de la machine. La nouvelle version de l'application est en cours de création pour être compatible avec les machines 64 bits. J'ai migré le code vers une machine virtuelle Parallels exécutant Windows 10 sur mon Macbook, et je construis la nouvelle version à l'aide de Visual Studio 2017. La construction fonctionne bien (j'utilise un projet d'assistant d'installation pour créer les fichiers d'installation). Mais, quand j'installe l'application, j'obtiens une erreur lors de la première tentative d'accès à la base de données. L'erreur est: L'accès au fichier de base de données n'est pas autorisé. [1884, Nom de fichier = C: \ ProgramData \ CompanyName \ ApplicationName \ AppDataBase.sdf, SeCreateFile].Obtention de l'erreur "Accès au fichier de base de données non autorisé" lors de la création d'une version pour les machines Windows 64 bits

Le fichier .sdf n'est pas marqué comme étant en lecture seule. Si je vais au fichier .sdf, une fois qu'il est installé, et donne à lire, écrire et modifier les autorisations à tout le monde (en utilisant l'explorateur de fichiers), alors l'application peut accéder au fichier et il n'y a pas d'erreur. Cependant, si j'essaie de le faire depuis mon code en utilisant File.SetAccessControl, j'obtiens à nouveau l'erreur d'accès. Je ne vois aucun moyen de définir des autorisations sur le fichier .sdf pendant le processus d'installation, en utilisant la fonctionnalité Assistant de configuration (vue du système de fichiers).

Voici la chaîne de connexion J'utilise:

<connectionStrings> 
<add name="ApplicationName.Properties.Settings.ApplicationNameConnectionString" 
      connectionString="Data Source=|DataDirectory|AppDataBase.sdf" 
      providerName="Microsoft.SqlServerCe.Client.4.0" /> 
</connectionStrings> 

Cela a bien fonctionné lors de la construction en utilisant Visual Studio 2010 et le déploiement sur les machines x86. Merci d'avance pour tout conseil que vous pouvez donner.

Répondre

0

En substance - votre emplacement est erroné. Le dossier %SystemDrive%\ProgramData\MyCompany\MyApp pour Windows 7 (et supérieur) est par défaut en lecture seule pour les utilisateurs non-administrateurs et doit être utilisé pour la configuration de la machine. Je vous recommande de lire

https://blogs.msdn.microsoft.com/patricka/2010/03/18/where-should-i-store-my-data-and-configuration-files-if-i-target-multiple-os-versions/

emplacement correct (je suppose basant sur ce qu'il est le fichier db qui devrait être partagée entre plusieurs utilisateurs) est par la machine « Documents »

Fichiers de type "Document" que les utilisateurs créent/ouvrent/clôturent/enregistrent dans l'application utilisés par les utilisateurs. Ce sont généralement des modèles ou des documents publics .

Exemple: MyTemplate.dot

Windows 7: C: \ Users \

public

Vista:% SystemDrive% \ Users \ Public

XP:% ALLUSERSPROFILE% \ Documents

variable d'environnement:

Vista/Win7:% PUBLIC% Remarque: N'existe pas sous XP

ID de dossier connu: FOLDERID_PublicDocuments

System.Environment.SpecialFolder: System.Environment.SpecialFolder.CommonDocuments

CSIDL: CSIDL_COMMON_DOCUMENTS

+0

Merci beaucoup! C'est ce que je cherchais! J'ai supprimé tout ce qui dans mon code manipulait l'emplacement ProgramData et j'ai supprimé le projet de déploiement hérité comme un moyen de publier l'application. Ensuite, j'ai utilisé la fonctionnalité Publier du projet (après avoir vérifié tous les paramètres), et cela a fonctionné! Merci beaucoup. Je n'avais rien vu qui m'ait fait connaître le changement de l'emplacement du dossier, alors je me serais battu avec ça pendant longtemps. – rogdawg

2

Sonne comme il pourrait être UAC

Assurez-vous que vous utilisez l'exe (pas le msi) et que vous avez défini Privilégié à true dans les LaunchConditions pour votre projet d'installation

Assurez-vous aussi exécutez l'application par un clic droit et en sélectionnant "Exécuter en tant qu'administrateur"

+0

Nous vous remercions de votre réponse. J'ai couru le programme d'installation en tant qu'administrateur (using Setup.exe, au lieu du fichier .msi) mais, j'obtiens toujours l'erreur quand j'exécute l'application. L'une des exigences de l'application est qu'une personne normale non administrateur puisse l'exécuter. Jusqu'à présent, cela fonctionnait quand je mettais la base de données dans un sous-répertoire du répertoire ProgramData (n'est-ce pas à quoi sert le répertoire?). Mais, maintenant ça ne marche pas, et je ne trouve aucun moyen de le faire fonctionner à nouveau. Pouah! – rogdawg

+0

pour clarifier: Si j'exécute l'application en tant qu'administrateur, cela fonctionne. Mais, comme je l'ai dit, une des exigences de l'application est qu'elle devrait fonctionner sous des privilèges normaux. – rogdawg

0

pourquoi ne pas simplement utiliser% APPDATA%?