Windows 7用户帐户控制更改ConfigurationSettings.AppSettings检索的配置字符串?

时间:2013-11-22 03:40:21

标签: .net app-config configuration-files uac

背景

我有一个Windows窗体应用程序(.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"];

设置

因为我遇到了问题,所以我用MessageBox.Show()语句填充了应用程序的启动和适用部分,每个语句都提供了有关我在程序中的位置以及变量值的相关信息。

我有一个创建和MSI文件的安装程序项目。我把那个文件复制到客户端的机器上然后安装它(如果已经安装了应用程序,我先卸载它)。

问题

我看到一些非常奇怪的行为......

  1. 如果我以管理员身份运行应用程序(右键单击&gt;以管理员身份运行),应用程序将按预期运行。它选择预期的连接字符串(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文件,应用程序仍会运行(呵呵???怎么样??)但有一些区别:
    一个。如果我以管理员身份运行,则无法找到连接字符串connectionString,并且出现错误`对象引用未设置为对象的实例。'
    湾如果我从“开始”菜单运行或双击.exe文件,它将返回Windows身份验证连接字符串。
  4. 我决定尝试其他的东西。我在connectionString文件中更改了连接字符串(app.config)的名称。所以我把它命名为connectionStringDude。现在,当我以上述两种方式运行它时,“管理员运行”版本再次起作用,但是另一个版本无法通过该名称找到连接字符串,并且应用程序获得一个`对象引用未设置为实例一个对象。'。
  5. 所以在我看来,应用程序可能会使用一些层次结构来查找连接字符串connectionString。如果框架在app.config中找不到连接字符串,它会检查machine.config,依此类推,直到它找到或不找到它。

    我正试图弄清楚我的头发。为什么连接字符串CHANGE仅基于“以管理员身份运行”?

    而且要清楚,相同的代码行:

    dbConnString = ConfigurationSettings.AppSettings["connectionString"];

    在dbConnString中返回一个完全不同的值,具体取决于我是否以管理员身份运行。

1 个答案:

答案 0 :(得分:1)

使用Process Monitor查看Windows从哪里加载应用程序设置。

.NET应用程序中的配置设置保存在单独的app.exe.config文件中。你可能在某个地方有一个迷路文件。

使用UAC文件虚拟化,该文件可能位于:

  

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

使用进程监视器来监视应用程序的所有文件访问,尤其是*.config个文件。