当用户被拒绝访问 AppData (Roaming) 文件夹时,SQL Server Compact 4.0 无法在 Windows 7 上运行,但仍可以在 Windows 10 中运行

Posted

技术标签:

【中文标题】当用户被拒绝访问 AppData (Roaming) 文件夹时,SQL Server Compact 4.0 无法在 Windows 7 上运行,但仍可以在 Windows 10 中运行【英文标题】:When Users Are Denied Access To AppData (Roaming) Folder, SQL Server Compact 4.0 Cannot Work On Windows 7 But Can Still Work In Windows 10 【发布时间】:2018-10-15 00:58:46 【问题描述】:

我有一个基于 WPF 的桌面应用程序,它使用带有实体框架和 LINQ 的 SQL Server Compact 4.0。几年来它一直运行良好,直到最近一些用户在打开它时遇到问题,因为它不断收到此异常。

Exception at outer most = System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.Data.SqlServerCe.SqlCeException: Unspecified error [ sqlcese40.dll ]
at System.Data.SqlServerCe.SqlCeConnection.Open(Boolean silent)
at System.Data.SqlServerCe.SqlCeConnection.Open()
at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.<Open>b__36(DbConnection t, DbConnectionInterceptionContext c)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext)
at System.Data.Entity.Core.EntityClient.EntityConnection.<Open>b__2()
at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute(Action operation)
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
--- End of inner exception stack trace ---
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
at System.Data.Entity.DbContextTransaction.EnsureOpenConnection()
at System.Data.Entity.DbContextTransaction..ctor(EntityConnection connection)
at System.Data.Entity.Database.BeginTransaction()
at Ecms.Utilities.DatabaseVersionHelper.UpdateToVersion(String database, Int32 version)
EXCEPTION: System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.Data.SqlServerCe.SqlCeException: Unspecified error [ sqlcese40.dll ]
at System.Data.SqlServerCe.SqlCeConnection.Open(Boolean silent)
at System.Data.SqlServerCe.SqlCeConnection.Open()
at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.<Open>b__36(DbConnection t, DbConnectionInterceptionContext c)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext)
at System.Data.Entity.Core.EntityClient.EntityConnection.<Open>b__2()
at System.Data.Entity.Infrastructure.DefaultExecutionStrategy.Execute(Action operation)
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
--- End of inner exception stack trace ---
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
at System.Data.Entity.DbContextTransaction.EnsureOpenConnection()
at System.Data.Entity.DbContextTransaction..ctor(EntityConnection connection)
at System.Data.Entity.Database.BeginTransaction()
at Ecms.Utilities.DatabaseVersionHelper.UpdateToVersion(String database, Int32 version)

它似乎在创建新的实体实例时发生,如下面的代码块。

using (var db = new MyEntity())

    // Do something

它是使用“数据库中的 EF 设计器”选项创建的,因为我添加了一个新的“ADO.NET 实体数据模型”。我确实尝试使用 SQLite,但我永远无法安装它并使其在 Visual Studio Community 2015 中运行。我还查看了 LocalDB,但似乎用户必须在我的应用程序中安装一些额外的东西才能工作,这就是我的工作。我尽量避免。

我发现当用户无权访问 AppData (Roaming) 文件夹时会出现问题。我在装有 Windows 7 的虚拟机上进行了测试。如果我有权访问 AppData (Roaming) 文件夹,则该应用程序将运行,反之亦然。

但是,在装有 Windows 10 的虚拟机上进行测试时,无论我是否有权访问 AppData (Roaming) 文件夹,该应用都可以正常运行。

请注意,我的应用程序不会故意使用 AppData (Roaming) 文件夹。然而,我怀疑一些依赖库正在使用它,到目前为止我只能确定 SQL Server Compact 4.0 受到影响。

还要记住,受影响的用户似乎坚持不更改对 AppData(漫游)文件夹的访问权限。

有趣的是,我还发现某些应用程序在限制 AppData (Roaming) 文件夹时无法打开,例如 Notepad++ 和 Skype。

有人有类似经历吗?为什么这发生在 Windows 7 而不是 Windows 10 中? AppData(漫游)文件夹是否对许多桌面应用程序的工作起着至关重要的作用?有解决办法吗?

【问题讨论】:

【参考方案1】:

创建一个应用程序安装程序,在 AppData 下创建一个文件夹,并将数据库放在那里

【讨论】:

我相信安装时可以在AppData下创建文件夹和数据库。但我认为该应用程序稍后将无法访问它,因为用户无权访问 AppData。此外,我更倾向于根本不使用 AppData,因为用户决心继续阻止它。

以上是关于当用户被拒绝访问 AppData (Roaming) 文件夹时,SQL Server Compact 4.0 无法在 Windows 7 上运行,但仍可以在 Windows 10 中运行的主要内容,如果未能解决你的问题,请参考以下文章

无法让“npm install -g”在任何包上工作(AppData/Roaming/npm 始终为空)

获取 403:禁止访问:当用户意外关闭登录会话时,访问被拒绝

错误:尝试更新 expo-cli 时“操作被您的操作系统拒绝”

win7 系统盘下AppData文件夹中Local和Roaming分别有啥作用?

npm global 是不是应该安装在 AppData\Roaming 中?

Windows 服务项目中的 AppData\Roaming 文件夹