Ошибка получения доступа к файлу базы данных не разрешена при создании сборки для 64-битных компьютеров с Windows

Я создаю новую версию существующего настольного приложения Windows, которое хорошо работает уже несколько лет. Приложение использует базу данных SqlServerCe, которая устанавливается в DataDirectory машины. Новая версия приложения создается для совместимости с 64-битными машинами. Я перенес код на виртуальную машину Parallels под управлением Windows 10 на моем Macbook, и я создаю новую версию с помощью Visual Studio 2017. Сборка работает нормально (я использую проект мастера установки для создания файлов установки). Но когда я устанавливаю приложение, я получаю сообщение об ошибке при первой попытке доступа к базе данных.

Ошибка: доступ к файлу базы данных запрещен. [1884, имя файла = C: \ ProgramData \ CompanyName \ ApplicationName \ AppDataBase.sdf, SeCreateFile].

Файл .sdf не помечен как доступный только для чтения. Если я перейду к файлу .sdf после его установки и дам права на чтение, запись и изменение для всех (с помощью проводника файлов), тогда приложение сможет получить доступ к файлу и ошибки не возникнет. Однако, если я попытаюсь сделать это из своего кода с помощью File.SetAccessControl, я снова получу ошибку доступа. Я не вижу способа установить разрешения для файла .sdf в процессе установки с помощью функциональных возможностей мастера установки (просмотр файловой системы).

Вот строка подключения, которую я использую:

<connectionStrings>
<add name="ApplicationName.Properties.Settings.ApplicationNameConnectionString"
            connectionString="Data Source=|DataDirectory|AppDataBase.sdf"
            providerName="Microsoft.SqlServerCe.Client.4.0" />
</connectionStrings>

Это отлично работало при сборке с использованием Visual Studio 2010 и развертывании на машинах x86. Заранее благодарим вас за любой совет, который вы можете дать.


person rogdawg    schedule 11.10.2017    source источник


Ответы (3)


По сути - ваше местоположение неверное. Папка %SystemDrive%\ProgramData\MyCompany\MyApp для Windows 7 (и выше) по умолчанию предназначена только для чтения для пользователей без прав администратора и должна использоваться для настройки машины. Я бы рекомендовал вам прочитать

https://blogs.msdn.microsoft.com/patricka/2010/03/18/where-should-i-store-my-data-and-configuration-files-if-i-target-multiple-os-versions/

Правильное расположение (я предполагаю, основываясь на том факте, что это файл db, который должен использоваться несколькими пользователями) - это «Документы» для каждой машины.

Файлы типа «документ», которые пользователи создают / открывают / закрывают / сохраняют в приложении, которые используются пользователями. Обычно это шаблонные или общедоступные документы.

Пример: MyTemplate.dot

Windows 7: C: \ Users \ Public

Vista:% SystemDrive% \ Users \ Public

XP:% ALLUSERSPROFILE% \ Documents

Переменная среды:

Vista / Win7:% PUBLIC% Примечание: не существует в XP

Известный идентификатор папки: FOLDERID_PublicDocuments

System.Environment.SpecialFolder: System.Environment.SpecialFolder.CommonDocuments

CSIDL: CSIDL_COMMON_DOCUMENTS

person Ondrej Svejdar    schedule 16.10.2017
comment
Большое тебе спасибо! Это то, что я искал! Я удалил в своем коде все, что манипулировало расположением ProgramData, и удалил устаревший проект развертывания как способ публикации приложения. Затем я использовал функцию публикации проекта (после проверки всех настроек), и это сработало! Большое спасибо. Я не видел ничего, что сообщало бы мне об изменении местоположения папки, поэтому я бы долго боролся с этим. - person rogdawg; 19.10.2017

Похоже, это может быть UAC

Убедитесь, что вы используете exe (а не msi) и что для параметра Privileged установлено значение true в LaunchConditions для вашего проекта установщика.

Также убедитесь, что вы запускаете приложение, щелкнув правой кнопкой мыши и выбрав «Запуск от имени администратора».

person Jeff    schedule 15.10.2017
comment
Благодарю за ваш ответ. Я запустил установщик как администратор (используя Setup.exe вместо файла .msi), но при запуске приложения я все равно получаю сообщение об ошибке. Одним из требований к приложению является то, что его должен уметь запускать обычный человек, не являющийся администратором. До сих пор это работало, когда я помещал базу данных в подкаталог каталога ProgramData (разве этот каталог не для этого?). Но теперь это не работает, и я не могу найти способ заставить его снова работать. Фу! - person rogdawg; 15.10.2017
comment
Для уточнения: Если я запускаю приложение от имени администратора, оно работает. Но, как я уже сказал, одним из требований к приложению является то, что оно должно работать с обычными привилегиями. - person rogdawg; 16.10.2017

почему бы просто не использовать% APPDATA%?

person Felipe Valdes    schedule 19.10.2017