为 64 位 windows 机器创建构建时出现 "Access to database file is not allowed" 错误

Getting "Access to database file is not allowed" error when creating a build for 64-bit windows machines

我正在为现有的 Windows 桌面应用程序创建一个新版本,该应用程序多年来一直运行良好。该应用程序使用 SqlServerCe 数据库,该数据库安装在机器的 DataDirectory 中。正在创建应用程序的新版本以与 64 位机器兼容。我已将代码迁移到我的 Macbook 上的 Parallels VM 运行 Windows 10,并且我正在使用 Visual Studio 2017 构建新版本。构建工作正常(我正在使用设置向导项目来创建安装文件)。但是,当我安装应用程序时,第一次尝试访问数据库时出现错误。

错误是: 不允许访问数据库文件。 [ 1884,文件名 = C:\ProgramData\CompanyName\ApplicationName\AppDataBase.sdf,SeCreateFile].

.sdf 未标记为只读。如果我转到 .sdf 文件,一旦它被安装,并赋予每个人读取、写入和修改权限(使用文件资源管理器),那么应用程序可以访问该文件并且没有错误。但是,如果我尝试使用 File.SetAccessControl 从我的代码中执行此操作,我会再次遇到访问错误。使用安装向导功能(文件系统视图),我在安装过程中看不到任何设置 .sdf 文件权限的方法。

这是我使用的连接字符串:

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

这在使用 Visual Studio 2010 构建并在 x86 机器上部署时运行良好。预先感谢您提供的任何建议。

听起来可能是 UAC

确保您运行正在运行 exe(而不是 msi)并且您在安装程序项目的 LaunchConditions 中将 Privileged 设置为 true

还要确保您 运行 通过右键单击并选择 "Run as Administrator"

应用程序

本质上-你的位置是错误的。 Windows 7(及更高版本)的文件夹 %SystemDrive%\ProgramData\MyCompany\MyApp 默认情况下对非管理员用户是只读的,应该用于机器配置的东西。我建议你阅读

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

正确的位置(我假设基于应该在多个用户之间共享的数据库文件)是每台机器的“文档”

“Document” type files that users create/open/close/save in the application that are used across users. These are usually template or public documents.

Example: MyTemplate.dot

Windows 7: C:\Users\Public

Vista: %SystemDrive%\Users\Public

XP: %ALLUSERSPROFILE%\Documents

Environment Variable:

Vista/Win7: %PUBLIC% Note: Does not exist on XP

Known Folder ID: FOLDERID_PublicDocuments

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

CSIDL: CSIDL_COMMON_DOCUMENTS

为什么不简单地使用 %APPDATA% ?