Недавно был перенесен сервер, на котором размещен csharpindepth.com.
Большая часть работы работает нормально, но я не могу получить базу данных, используемую для хранения ошибок, заметок и т.д.
Релевантные детали:
- 32-разрядная версия Windows Server 2003
- Установлен SQL Server Express 2005
- Пул ASP.NET работает под учетной записью "NETWORK SERVICE"
- .NET 3.5
- У всех есть полное разрешение на файлы базы данных (на данный момент, чтобы это исключить!)
-
Строка подключения:
Data Source=.;AttachDbFilename=|DataDirectory|\WebSiteData.mdf; Integrated Security=True;User Instance=True
-
Я подключаюсь, создавая новый
WebSiteDataContext
(у которого указанная выше строка подключения по умолчанию)
Используя небольшое тестовое консольное приложение, запущенное из каталога, содержащего файлы, в качестве учетной записи администратора, используя тот же запрос, я могу видеть содержимое базы данных.
В ASP.NET я получаю это исключение:
SqlException (0x80131904): User does not have permission to perform this action.
EDIT: дополнительная информация, здесь трассировка стека:
[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
EDIT: я ошибался в том, что имя файла должно быть правильным - изменение строки подключения, чтобы заставить его разговаривать с другим файлом, не изменяет ошибку.
ProcMon никогда не показывает его касание файла...
EDIT: дальнейшие странности - перезапуск пула приложений с его запуском под учетной записью Local System все еще имеет проблемы, что примерно так же странно, как и получается! Это, как будто, несмотря на сообщение об ошибке, он фактически пытается сделать что-то невозможное (например, с неправильным путем), а не просто проблему с разрешениями.
EDIT: дополнительная информация. Я только что запустил мое маленькое тестовое консольное приложение из службы как "NETWORK SERVICE" и (после первой попытки, которая была отключена) была успешной. Так что это не вопрос прав с точки зрения учетной записи пользователя... это что-то о среде, в которой она работает...