从ASP.NET访问"用户实例"数据库时出现用户权限错误

Jon*_*eet 26 .net sql sql-server asp.net permissions

最近迁移了托管csharpindepth.com的服务器.

大多数工作正常,但我无法进入用于举行勘误表,笔记等的数据库.

相关细节:

  • 32位Windows Server 2003
  • 安装了SQL Server Express 2005
  • 在"NETWORK SERVICE"帐户下运行的ASP.NET池
  • .NET 3.5
  • 每个人都拥有数据库文件的完全权限(目前,只是为了排除!)
  • 连接字符串:

    Data Source=.;AttachDbFilename=|DataDirectory|\WebSiteData.mdf;
    Integrated Security=True;User Instance=True
    
    Run Code Online (Sandbox Code Playgroud)
  • 我只是通过创建一个新WebSiteDataContext的连接(它具有上面的连接字符串作为其默认值)

使用从包含文件的目录运行的小型测试控制台应用程序作为管理员帐户,使用相同的查询,我可以看到数据库的内容.

在ASP.NET中,我遇到了这个异常:

SqlException (0x80131904): User does not have permission to perform this action.
Run Code Online (Sandbox Code Playgroud)

编辑:更多信息,这里是堆栈跟踪:

[SqlException (0x80131904): User does not have permission to perform this action.]
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4844759
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194
   System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2392
   System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) +35
   System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject) +144
   System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart) +342
   System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance) +221
   System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance) +189
   System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection) +4859187
   System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options) +31
   System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) +433
   System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject) +66
   System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) +499
   System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) +65
   System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) +117
   System.Data.SqlClient.SqlConnection.Open() +122
   System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) +44
   System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() +45
   System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() +20
   System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) +57
   System.Data.Linq.DataQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +35
Run Code Online (Sandbox Code Playgroud)

编辑:我错误的文件名必须是正确的 - 更改连接字符串,使其与不同的文件交谈不会改变错误.

ProcMon从未显示它触及文件...

编辑:更奇怪 - 重新启动应用程序池与它在本地系统帐户下运行仍然有问题,这是奇怪的,它得到!就好像,尽管有错误消息,它实际上是在尝试做一些不可能的事情(例如,使用错误的路径),而不仅仅是一个权限问题.

编辑:更多信息 - 我只是从服务运行我的小测试控制台应用程序作为"网络服务"和(在初始尝试超时后)它成功.因此,就用户帐户而言,它不是权限...它是关于它运行的环境的...

Rem*_*anu 6

儿童实例甚至开始了吗?当请求RANU数据库时,主实例(在这种情况下为.\ SQLEXPRESS)必须创建一个'子'实例,换句话说,启动sqlservr.exe进程作为在请求RANU的用户的凭据下运行的用户进程来自.SQLEXPRESS实例的连接.在这种情况下,实例必须以"网络服务"启动.

要验证子实例是否已启动,请连接到主实例(.\ SQLEXPRESS)并检查sys.dm_os_child_instances:

SELECT * 
FROM sys.dm_os_child_instances
Run Code Online (Sandbox Code Playgroud)

如果启动了NETWORK SERVICE拥有的子实例,请将其取出instance_pipe_name并直接连接到子实例:

sqlcmd -S np:\\.\pipe\<child pipe name>\tsql\query
Run Code Online (Sandbox Code Playgroud)

理想情况下,连接为NETWORK SERVICE(例如,从作为NEWTORK SERVICE启动的交互式cmd控制台启动,也许使用at.exe将来安排它1分钟).如果可行,最后一步是尝试使用常规sp_attach_db附加MDF.

这些步骤的想法不是解决问题,而是查明失败的原因,因为你得到的错误是有点通用的......并不完全有用.


Otá*_*cio 0

我要做的第一件事是关闭 filemon(或更好的进程监视器)以查看 IIS 进程是否能够打开数据库文件 - 对我来说这似乎是一个安全问题。

\n\n

另外:确保 ~/App_Data 文件夹不是只读的。另外,检查您是否已向“Network Service\xe2\x80\x9d”帐户授予同一文件夹的完全权限。

\n\n

您可能需要运行 IISRESET 来重新启动 IIS 并刷新其权限。

\n