В настоящее время я работаю над Internet Explorer BHO, который был написан на VB.NET с использованием библиотеки Add-In Express (www.add-in-express.com) .NET и нацелен на .NET Framework 2.0. Надстройка браузера устанавливается в каталог пользователя AppData/Local с помощью установщика InnoSetup 5, который также обрабатывает регистрацию надстройки.
После установки установщик InnoSetup имеет повышенный уровень контроля учетных записей, что требуется для исполняемого файла (предоставляемого надстройкой Express), который регистрирует BHO в браузере.
Я должен отметить, что мой опыт работы с .NET в лучшем случае минимален — я знаю достаточно, чтобы кодировать приложение, но на самом деле не знаю, как операционная система взаимодействует с приложениями — я постараюсь описать проблему как можно лучше. Я могу.
Одной из функций, которую использует мое дополнение, являются пользовательские настройки Visual Studio (через раздел «Свойства-> Настройки» в VS). При отладке надстройки в IE на исходной машине все работает как положено.
При установке надстройки на новую машину я получаю исключение всякий раз, когда мое приложение пытается вызвать My.Settings.Save(). Я изо всех сил пытался найти в Интернете другие идентичные сценарии для этой же проблемы. Пожалуйста, найдите трассировку стека ниже:
Exception Source: mscorlib
Exception Type: System.InvalidOperationException
Exception Message: Method failed with unexpected error code 3.
Exception Target Site: CreateInternal
---- Stack Trace ----
System.Security.AccessControl.NativeObjectSecurity.CreateInternal(resourceType As ResourceType, isContainer As Boolean, name As String, handle As SafeHandle, includeSections As AccessControlSections, createByName As Boolean, exceptionFromErrorCode As ExceptionFromErrorCode, exceptionContext As Object)
mscorlib.dll: N 0306 (0x132) IL
System.Security.AccessControl.FileSystemSecurity..ctor(isContainer As Boolean, name As String, includeSections As AccessControlSections, isDirectory As Boolean)
mscorlib.dll: N 0017 (0x11) IL
System.Security.AccessControl.FileSecurity..ctor(fileName As String, includeSections As AccessControlSections)
mscorlib.dll: N 0000 (0x0) IL
System.Configuration.Internal.WriteFileContext.DuplicateTemplateAttributes(source As String, destination As String)
mscorlib.dll: N 0008 (0x8) IL
System.Configuration.Internal.WriteFileContext.DuplicateFileAttributes(source As String, destination As String)
mscorlib.dll: N 0028 (0x1C) IL
System.Configuration.Internal.WriteFileContext.Complete(filename As String, success As Boolean)
mscorlib.dll: N 0018 (0x12) IL
System.Configuration.Internal.InternalConfigHost.StaticWriteCompleted(streamName As String, success As Boolean, writeContext As Object, assertPermissions As Boolean)
mscorlib.dll: N 0070 (0x46) IL
System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(streamName As String, success As Boolean, writeContext As Object, assertPermissions As Boolean)
mscorlib.dll: N 0000 (0x0) IL
System.Configuration.Internal.DelegatingConfigHost.WriteCompleted(streamName As String, success As Boolean, writeContext As Object, assertPermissions As Boolean)
mscorlib.dll: N 0000 (0x0) IL
System.Configuration.ClientSettingsConfigurationHost.WriteCompleted(streamName As String, success As Boolean, writeContext As Object)
mscorlib.dll: N 0019 (0x13) IL
System.Configuration.UpdateConfigHost.WriteCompleted(streamName As String, success As Boolean, writeContext As Object)
mscorlib.dll: N 0036 (0x24) IL
System.Configuration.MgmtConfigurationRecord.SaveAs(filename As String, saveMode As ConfigurationSaveMode, forceUpdateAll As Boolean)
mscorlib.dll: N 0793 (0x319) IL
System.Configuration.Configuration.SaveAsImpl(filename As String, saveMode As ConfigurationSaveMode, forceSaveAll As Boolean)
mscorlib.dll: N 0036 (0x24) IL
System.Configuration.Configuration.Save()
mscorlib.dll: N 0000 (0x0) IL
System.Configuration.ClientSettingsStore.WriteSettings(sectionName As String, isRoaming As Boolean, newSettings As IDictionary)
mscorlib.dll: N 0219 (0xDB) IL
System.Configuration.LocalFileSettingsProvider.SetPropertyValues(context As SettingsContext, values As SettingsPropertyValueCollection)
mscorlib.dll: N 0219 (0xDB) IL
System.Configuration.SettingsBase.SaveCore()
mscorlib.dll: N 0154 (0x9A) IL
System.Configuration.SettingsBase.Save()
mscorlib.dll: N 0016 (0x10) IL
System.Configuration.ApplicationSettingsBase.Save()
mscorlib.dll: N 0023 (0x17) IL
FindAndRemind.User.DetectUser()
mscorlib.dll: N 0042 (0x2A) IL
FindAndRemind.IEModule.IEModule_DownloadComplete()
mscorlib.dll: N 0151 (0x97) IL
AddinExpress.IE.ADXIEModule.DoDownloadComplete()
mscorlib.dll: N 0010 (0xA) IL
При поиске в каталоге User/AppData я вижу, что для имени организации не было создано папки. Я также читал, что файл user.config может быть создан самим Internet Explorer в папке Microsoft_Corporation, хотя он тоже пуст. Мне кажется, что это проблема с разрешениями, но я в недоумении из-за отсутствия у меня опыта кодирования приложений для Windows.
Кто-нибудь сталкивался с этой проблемой раньше, и если да, то как вы ее решили?
Заранее спасибо!
ИЗМЕНИТЬ:
Я также должен отметить, что исключение можно закрыть, и приложение может продолжать работать, однако данные настроек никогда не сохраняются, что делает мое дополнение немного избыточным по своей природе.
РЕДАКТИРОВАТЬ 2:
К сожалению, запуск Internet Explorer в режиме администратора невозможен, поскольку надстройка представляет собой обновление более старой версии, которая в настоящее время имеет более 20 000 пользователей. Наши пользователи имеют разный уровень квалификации, и надстройка должна работать «как есть» в различных операционных системах и пользовательских настройках.