У нас есть скрипт сборки Nant, который мы запускаем через SSH (Cygwin & Open SSH) для удаленного обновления наших баз данных. Когда сценарий Nant запускается через сеанс SSH, при попытке подключения к базе данных выдается следующая ошибка. Тем не менее, если я войду на сервер напрямую (используя ту же учетную запись, что и служба) и вручную выполню сценарии Nant, сценарий будет успешно выполнен.
Сообщение об ошибке:
System.InvalidOperationException:
Поставщики данных .Net Framework требуют
Microsoft Data Access
Компоненты (MDAC). Пожалуйста, установите
Компоненты доступа к данным Microsoft (MDAC)
версия 2.6 или новее.
---> System.IO.FileNotFoundException: получение фабрики класса COM для
компонент с CLSID
{} 2206CDB2-19C1-11D1-89E0-00C04FD7A829
не удалось из-за следующей ошибки:
8007007e.
Трассировка стека:
System.InvalidOperationException: The .Net Framework Data Providers require Microsoft Data Access Components(MDAC). Please install Microsoft Data Access Components(MDAC) version 2.6 or later.
---> System.IO.FileNotFoundException: Retrieving the COM class factory for component with CLSID {2206CDB2-19C1-11D1-89E0-00C04FD7A829} failed due to the following error: 8007007e.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly)
at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at System.Data.OleDb.OleDbConnectionInternal.CreateInstanceDataLinks()
at System.Data.OleDb.OleDbConnectionInternal.GetObjectPool()
--- End of inner exception stack trace ---
at System.Data.OleDb.OleDbConnectionInternal.GetObjectPool()
at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.OleDb.OleDbConnection.Open()
at UpgradeDatabases.UpgradeDatabase.Execute()
Потратив много времени на поиски причины, я застрял. Вот некоторые наблюдения, которые я сделал:
- Скрипт отлично работает, когда я запускаю его вручную на той же машине (без SSH). Я даже могу запустить скрипт вручную с тем же пользователем, под которым работает служба SSH.
- Поскольку скрипт Nant выполняется в контексте службы, проблема, похоже, связана с профилем пользователя.
- Сценарий выполняется на Windows 2008 Server с установленным .NET 3.5. Я не предполагаю, что MDAC будет проблемой здесь, поскольку исключение указывает
- Один сайт заявляет , что он может быть связан с UPHClean (который является частью службы профилей пользователей в Windows Server 2008). Я не смог подтвердить, что это на самом деле проблема. Я посмотрел в Event Viewer для Event ID 1530 и есть несколько случаев, но они не коррелируют с каждым выполнением сценария сборки.
- Я установил собственных поставщиков OleDb для SQL Server 2008, и возникает та же ошибка.
У кого-нибудь есть совет, как я могу отследить причину этой проблемы? Похоже, это действительно связано с тем, что код выполняется в контексте службы. Я использовал Procmon, чтобы попытаться отследить казнь, но мне не повезло найти виновника. Заранее спасибо!