2013-11-22 2 views
0

BackgroundУправление учетными записями пользователей Windows 7 с изменением строки конфигурации, полученной ConfigurationSettings.AppSettings?

У меня есть приложение Windows Forms (.NET 3.5). Строка подключения базы данных хранится в файле app.config в разделе appSettings с именем «connectionString».

<appSettings> 

    <add key="connectionString" value="Data Source=REDACTED;Initial Catalog=REDACTED; UID=REDACTED; pwd=REDACTED;" /> 

</appSettings> 

Доступ к нему в коде для запросов к базе данных с помощью следующего кода:

dbConnString = ConfigurationSettings.AppSettings["connectionString"]; 

Setup

Потому что у меня возникли проблемы, я завален запуска и применимые разделы приложение с операциями MessageBox.Show(), каждое из которых дает соответствующую информацию о том, где я нахожусь в программе, и каковы значения переменных.

У меня есть проект установщика, который создает файл MSI. Я беру этот файл, копирую его на компьютер клиента и устанавливаю его (если приложение уже установлено, я сначала его удалю).

Проблема

Я вижу некоторые действительно странное поведение ...

  1. При запуске приложения в качестве администратора (правой кнопкой мыши> Запуск от имени администратора), приложение запускается как и ожидалось , Он выбирает ожидаемую строку подключения (Data Source=REDACTED;Initial Catalog=REDACTED; UID=REDACTED; pwd=REDACTED;) и без проблем подключает приложение к базе данных. Обратите внимание, что в строке подключения используется проверка подлинности SQL Server (а не проверка подлинности Windows).
  2. Если я просто дважды щелкнул файл .exe или запустил его из меню «Пуск», я получаю абсолютно РАЗЛИЧНОЕ значение строки подключения. Я верну это вместо этого (в том же месте в коде): Data Source=REDACTED;Integrated Security=SSPI;Initial Catalog=REDACTED. Обратите внимание, что для проверки соединения с базой данных используется проверка подлинности Windows.
  3. Если я полностью удаляю файл app.config, приложение все еще работает (да, как?), Но с некоторыми отличиями:
    a. Если я запускаю его как администратор, он не может найти строку подключения connectionString, и я получаю ошибку «Ссылка на объект не установлена ​​в экземпляр объекта».
    b. Если я запускаю из меню «Пуск» или дважды щелкнув файл .exe, он возвращает строку подключения к аутентификации Windows.
  4. Я решил попробовать что-то еще. Я изменил имя строки подключения (connectionString) в файле app.config. Поэтому я назвал его connectionStringDude. Теперь, когда я запускаю его двумя способами, описанными выше, снова запускается версия «Запуск от имени администратора», но другая не может найти строку подключения по этому имени, и приложение получает ссылку «Объект», не установленную в экземпляр объект.'.

Таким образом, мне кажется, что существует какая-то иерархия, которую приложение использует для поиска строки подключения connectionString. Если структура не может найти строку подключения в app.config, она проверяет файл machine.config и т. Д., Пока он не найдет его или нет.

Я разрываю волосы, пытаясь понять это.Почему строка подключения CHANGE основывается только на «Запуск от имени администратора»?

И только, чтобы быть ясно, в той же строке кода:

dbConnString = ConfigurationSettings.AppSettings["connectionString"];

возвращается совершенно другое значение, в зависимости от dbConnString если я Ран в качестве администратора или нет.

ответ

1

Используйте Process Monitor, чтобы увидеть, где Windows загружает настройки вашего приложения.

Параметры конфигурации в приложении .NET сохраняются в отдельных файлах app.exe.config. Вероятно, у вас где-то есть бродячий файл.

и виртуализации файлов контроля учетных записей, этот файл может сидеть в чем-то вроде:

C:\Users\Richard\AppData\Local\VirtualStore\Program Files(x86)\RichardWare\SuperCoolapp.exe.config

Использование Process Monitor смотреть все обращения к файлам вашего приложения, особенно *.config файлы.

+0

Хорошо, я сделаю это. Спасибо! – richard