为 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
默认情况下对非管理员用户是只读的,应该用于机器配置的东西。我建议你阅读
正确的位置(我假设基于应该在多个用户之间共享的数据库文件)是每台机器的“文档”
“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% ?
我正在为现有的 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
默认情况下对非管理员用户是只读的,应该用于机器配置的东西。我建议你阅读
正确的位置(我假设基于应该在多个用户之间共享的数据库文件)是每台机器的“文档”
“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% ?