【发布时间】:2013-12-06 20:18:34
【问题描述】:
背景
我有一个 Windows 窗体应用程序 (.NET 3.5)。数据库连接字符串存储在名为“connectionString”的appSettings 部分的app.config 文件中。
<appSettings>
<add key="connectionString" value="Data Source=REDACTED;Initial Catalog=REDACTED; UID=REDACTED; pwd=REDACTED;" />
</appSettings>
在数据库查询的代码中使用以下代码访问它:
dbConnString = ConfigurationSettings.AppSettings["connectionString"];
设置
因为我遇到了问题,所以我在应用程序的启动部分和适用部分添加了 MessageBox.Show() 语句,每个语句都提供了有关我在程序中的位置以及变量值是什么的相关信息。
我有一个创建 MSI 文件的安装程序项目。我把那个文件复制到客户的机器上,然后安装它(如果应用程序已经安装,我先卸载它)。
问题
我看到了一些非常奇怪的行为......
- 如果我以管理员身份运行应用程序(右键单击 > 以管理员身份运行),应用程序将按预期运行。它选择预期的连接字符串 (
Data Source=REDACTED;Initial Catalog=REDACTED; UID=REDACTED; pwd=REDACTED;) 并将应用程序连接到数据库而不会出现问题。请注意,连接字符串使用的是 SQL Server 身份验证(不是 Windows 身份验证)。 - 如果我只是双击 .exe 文件,或者从开始菜单运行它,我会得到一个完全不同的连接字符串值。我取而代之的是(在代码中的同一位置):
Data Source=REDACTED;Integrated Security=SSPI;Initial Catalog=REDACTED。请注意,这是使用 Windows 身份验证来尝试连接到数据库。 - 如果我完全删除了
app.config文件,应用程序仍然可以运行(嗯???怎么样??)但有一些不同:
一种。如果我以管理员身份运行,它找不到连接字符串connectionString,并且我收到错误消息“对象引用未设置为对象的实例。”
湾。如果我从“开始”菜单运行或双击 .exe 文件,它会返回 Windows 身份验证连接字符串。 - 我决定尝试其他方法。我在
app.config文件中更改了连接字符串的名称(connectionString)。所以我把它命名为connectionStringDude。现在,当我以上述两种方式运行它时,“以管理员身份运行”版本再次起作用,但另一个无法找到该名称的连接字符串,并且应用程序获得了一个未设置为实例的“对象引用”一个对象。'。
所以在我看来,应用程序可能正在使用一些层次结构来查找连接字符串connectionString。如果框架在 app.config 中找不到连接字符串,它会检查 machine.config,依此类推,直到找到或找不到。
我正在努力解决这个问题。为什么仅基于“以管理员身份运行”的连接字符串会更改?
为了清楚起见,同一行代码:
dbConnString = ConfigurationSettings.AppSettings["connectionString"];
在 dbConnString 中返回一个完全不同的值,具体取决于我是否以管理员身份运行。
【问题讨论】:
标签: .net app-config configuration-files uac